我应该等待 ValueTask<T> 吗?

Should I await ValueTask<T>?

请问哪个是 ValueTask 的有效实现? 缓存服务 returns 来自缓存或数据库的数据。

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;

这里有点混乱。

Would this be:

var employeesFacts = await _cacheService.GetEmployeesFacts();

通常是。

or

var employeesFacts = _cacheService.GetEmployeesFacts().Result;

Little bit confused here.

从来没有。

让我们为您解惑。

第一:value task简单来说就是一个通过value而不是reference复制的任务。 不要使用 ValueTask,除非您知道其中的区别并且有理由在经验性能研究的驱动下这样做,该研究表明常规任务是收集压力的主要贡献者。几乎一直使用常规任务。

您不会根据任务是按值还是按引用复制来更改使用任务的方式。不管怎样,你都在等待任务。

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