[英]Do I need to query the .Result property of a ValueTask that I choose to not await?
[英]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.