我应该等待 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
。几乎总是做错事。
请问哪个是 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
。几乎总是做错事。