繁体   English   中英

我应该等待ValueTask吗? <T> ?

[英]Should I await ValueTask<T>?

哪个是ValueTask的有效实现? 缓存服务从缓存或DB返回数据。

public async ValueTask<IList<HrEmploymentDataCustom>> GetEmployeesFacts()
{
    try
    {
        var facts = (List<HrEmploymentDataCustom>) _memoryCache.Get("facts");
        return facts ?? await _accountService.GetEmploymentFacts(DetailsRequestType.All, null);
    }
    catch (Exception e)
    {
        var tc = new TelemetryClient();
        tc.TrackException(e);
        return null;
    }
}

这是: var employeesFacts = await _cacheService.GetEmployeesFacts();

var employeesFacts = _cacheService.GetEmployeesFacts().Result;

这里有点困惑。

这会是:

var employeesFacts = await _cacheService.GetEmployeesFacts();

通常是的。

要么

var employeesFacts = _cacheService.GetEmployeesFacts().Result;

这里有点困惑。

永远不能。

让我们不相信你。

第一:值任务只是一个由值而不是引用复制的任务。 不要使用ValueTask,除非您知道差异,并且有理由这样做,这表明经常性能研究表明常规任务是收集压力的一个重要因素。 几乎所有时间都只使用常规任务。

您不会根据是按值还是按引用复制任务来更改任务的使用方式 无论如何,你等待任务。

您永远不会在任务上使用.Result ,无论它是值还是引用。 为什么? 因为假设任务未完成:那么Result将同步等待其完成。 假设工作流的最后一步当前在等待调度的当前线程的队列中 你只是让那个线程入睡! 现在线程正在休眠,等待自己将其唤醒,因此它将永远睡眠。 永远不要使用.Result 几乎总是这样做是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM