我应该等待ValueTask <t>吗?

时间:2018-09-20 12:18:07

标签: c# asp.net-core c#-7.0

请问哪个是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;

这里有些困惑。

1 个答案:

答案 0 :(得分:18)

  

会是:

var employeesFacts = await _cacheService.GetEmployeesFacts();

通常是。

  

var employeesFacts = _cacheService.GetEmployeesFacts().Result;
  

这里有些困惑。

从来没有。

让我们使您困惑。

首先:值任务只是一个按值而不是引用复制的任务。 除非知道差异并有理由这样做,否则不要使用ValueTask,这是由一项经验性能研究得出的,该研究表明常规任务是造成收集压力的主要因素。几乎一直都在使用常规任务。

您不会根据是按值复制还是按引用复制任务来使用。无论如何,您都在等待任务。

无论是值还是引用,您都永远不会在任务上使用.Result。为什么?因为假设任务尚未完成,所以Result将同步等待其完成。 假设工作流的最后一步当前位于等待分派的当前线程的队列中。您只需将该线程入睡!现在线程正在休眠,等待自身唤醒它,因此它将永远休眠。切勿使用.Result。几乎总是做错事。