我应该等待ValueTask <T>吗?

szi*_*szu 3 c# asp.net-core c#-7.0

哪个是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这会是: var employeesFacts = await _cacheService.GetEmployeesFacts();

要么 var employeesFacts = _cacheService.GetEmployeesFacts().Result;

这里有点困惑.

Eri*_*ert 20

这会是:

var employeesFacts = await _cacheService.GetEmployeesFacts();
Run Code Online (Sandbox Code Playgroud)

通常是的.

要么

var employeesFacts = _cacheService.GetEmployeesFacts().Result;
Run Code Online (Sandbox Code Playgroud)

这里有点困惑.

永远不能.

让我们不相信你.

第一:值任务只是一个由值而不是引用复制的任务.不要使用ValueTask,除非您知道差异,并且有理由这样做,这表明经常性能研究表明常规任务是收集压力的一个重要因素.几乎所有时间都只使用常规任务.

您不会根据是按值还是按引用复制任务来更改任务的使用方式.无论如何,你等待任务.

您永远不会.Result在任务上使用它,无论它是值还是引用.为什么?因为假设任务未完成:然后Result将同步等待其完成.假设工作流的最后一步当前在等待调度的当前线程的队列中.你只是让那个线程入睡!现在线程正在休眠,等待自己将其唤醒,因此它将永远睡眠.切勿使用.Result.几乎总是这样做是错误的.

  • @sziszu:**做一项经验性绩效研究,确定任务是否是造成不必要的收集压力的重要因素**.如果是,请使用值任务再次进行相同的研究,看看它是否有所作为.**通过科学回答你的问题,而不是通过互联网向陌生人询问他们没有编写和从未运行**的程序的性能特征.你写了你的程序; 测试一下! (7认同)
  • 如果您知道自己在做什么(例如,有一个处理任务和 IAsyncEnumerables 的工作线程),则可以使用“.Result”或“.Wait()”(在任务上)。我想说:除非有必要,否则永远不要使用它,并且你绝对知道自己在做什么。 (4认同)