请问哪个是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();
或var employeesFacts = _cacheService.GetEmployeesFacts().Result;
这里有些困惑。
答案 0 :(得分:18)
会是:
var employeesFacts = await _cacheService.GetEmployeesFacts();
通常是。
或
var employeesFacts = _cacheService.GetEmployeesFacts().Result;
这里有些困惑。
从来没有。
让我们使您困惑。
首先:值任务只是一个按值而不是引用复制的任务。 除非知道差异并有理由这样做,否则不要使用ValueTask,这是由一项经验性能研究得出的,该研究表明常规任务是造成收集压力的主要因素。几乎一直都在使用常规任务。
您不会根据是按值复制还是按引用复制任务来使用。无论如何,您都在等待任务。
无论是值还是引用,您都永远不会在任务上使用.Result
。为什么?因为假设任务尚未完成,所以Result
将同步等待其完成。 假设工作流的最后一步当前位于等待分派的当前线程的队列中。您只需将该线程入睡!现在线程正在休眠,等待自身唤醒它,因此它将永远休眠。切勿使用.Result
。几乎总是做错事。