首页 > 解决方案 > C# .NET 中的 await Task.WhenAll 是否会阻塞?

问题描述

当谈到 .NET 中的 async/await 时,我有点困惑......

考虑以下方法:

public async Task DoSomething() {
   IEnumerable<Task> ts = GetSomeTasks(); // Some tasks that would do some random IO stuff, or whatever
   await Task.WhenAll(ts);
   Console.WriteLine("All tasks completed!");
}

Console.WriteLine是否保证在等待中的任务后执行调用ts?我想我已经看到在访问任务结果之前等待似乎不会像那样“阻塞”的情况。适用什么规则?

标签: c#.net.net-coreasync-await

解决方案


是否保证在等待 ts 中的任务后执行对 Console.WriteLine 的调用?

是的。

我想我已经看到在访问任务结果之前等待似乎不会像那样“阻塞”的情况。

不,事实并非如此。您只会在 await 运算符(或可能是语句中的下一个表达式,例如,一旦等待的事情完成后才能到达语句(await a) + (await b)

请注意,它Task.WhenAll本身并不是一个阻塞方法(与 不同Task.WaitAll) - 但它返回一个任务,该任务在作为参数传递的所有任务都完成之前不会完成。


推荐阅读