这将是一个有效的实施ValueTask
请?
缓存服务从缓存或数据库返回数据。
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();
or var employeesFacts = _cacheService.GetEmployeesFacts().Result;
这里有点困惑。
这会是:
var employeesFacts = await _cacheService.GetEmployeesFacts();
通常是的。
or
var employeesFacts = _cacheService.GetEmployeesFacts().Result;
这里有点困惑。
永远不能。
让我们为您解惑。
第一:值任务简单来说就是按值复制而不是按引用复制的任务。不要使用 ValueTask,除非您知道其中的差异,并且有理由根据实证性能研究(表明常规任务是收集压力的一个重要因素)来这样做。几乎一直使用常规任务即可。
你不改变你的方式use基于是否按值复制或按引用复制的任务。不管怎样,你都会等待任务。
你从不使用.Result
在任务上,无论它是值还是引用。为什么?因为假设任务没有完成:那么Result
将同步等待其完成。假设工作流的最后一步当前在当前线程的队列中等待分派。您只需将该线程置于睡眠状态即可!现在线程正在休眠,等待itself唤醒它,这样它就会永远沉睡。切勿使用.Result
。这样做几乎总是错误的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)