请问哪个是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;
这里有点混乱。
发布于 2018-09-20 12:24:37
这会是:
var employeesFacts = await _cacheService.GetEmployeesFacts();通常是的。
或
var employeesFacts = _cacheService.GetEmployeesFacts().Result;这里有点混乱。
永远不要。
让我们解除你的困惑吧。
首先: value任务只是由值而不是引用复制的任务。不使用ValueTask,除非您知道两者之间的差异,并且有理由这样做,这是由一项经验性能研究驱动的,该研究表明,常规任务是造成收集压力的一个重要因素。几乎所有时候都使用常规任务.
您不会根据任务是通过值复制还是通过引用来更改任务的使用方式。不管如何,你都在等待任务。
无论任务是值还是引用,您都不会在任务上使用.Result。为什么?因为假设任务没有完成:那么Result将同步等待它的完成。假设工作流的最后一步当前在等待调度的当前线程的队列中。你刚刚让那根线睡着了!现在线在睡觉,等待自己唤醒它,所以它将永远睡眠。永远不要使用.Result。几乎总是这样做是错误的。
https://stackoverflow.com/questions/52425028
复制相似问题