在 C# .NET 块中等待 Task.WhenAll 吗?

Eri*_*ing 1 .net c# async-await .net-core

当谈到 .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!");
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

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

是的。

我想我见过这样的情况,在访问任务结果之前 await 似乎不会像那样“阻塞”。

不,事实并非如此。你只得到该语句的await操作(或潜在的未来表达后声明,例如,用于(await a) + (await b)一旦这样被期待已久的事情已经完成。

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

  • 我认为你在最后一句话中省略了“not”(或者“Note”的意思是“Not”),这在某种程度上改变了语义。 (3认同)
  • @ErikKinding:是的 - 尽管 Close() 和 Dispose() 听起来都不像异步方法。 (2认同)