【发布时间】:2020-02-24 19:06:37
【问题描述】:
假设我有以下类似异步方法的调用堆栈:
async Task<T> Method1()
{
return await Method2();
}
async Task<T> Method2()
{
return await Method3();
}
async Task<T> Method3()
{
return await httpClient.ReadAsync(...);
}
因为只有 Method3 有真正的异步 IO 请求。我可以在 Method1 中等待一次吗?下面的方法会稍微提高性能吗?
async Task<T> Method1()
{
var task = Method2();
return await task;
}
Task<T> Method2()
{
return Method3();
}
Task<T> Method3()
{
return httpClient.ReadAsync(...);
}
【问题讨论】:
-
你try it out了吗?
-
在这里尝试不是最好的解决方案。这是 google 的一个案例 - dotnet 开发人员在博客中对此进行了广泛讨论,包括 C#8 支持 ValueTask 的优化,以使其更快。尝试一下不会给你那些讨论。观看channel9.msdn.com/Shows/On-NET/…
-
@TomTom:这无关,返回 ValueTask 并在每一层等待是另一回事,在上面的示例中 ValueTask 没有任何改变,仍然需要分配一个任务(
httpClient.ReadAsync(...)将始终返回一个任务,它基本上总是异步的,从不同步)。ValueTask 仅在可以同步完成时为您节省Task的分配 -
@TomTom 你是什么意思尝试它不会是最好的解决方案?这是什么建议?对代码进行基准测试以查看它的运行速度和分配的内存量,并对其进行测试以验证它返回正确的结果正是应该做的。
-
基准测试特别困难,尤其是对于像这样的微代码。同样对其进行基准测试也会忽略另一种方法可能更好的事实 - 您在基准测试中看不到的方法。
标签: c# asp.net asp.net-core