经过几个小时的努力,我在我的应用程序中发现了一个错误。我认为下面的两个函数具有相同的行为,但实际上它们并不相同。
有人能告诉我底层到底发生了什么,以及它们为什么表现出不同的方式吗?
public async Task MyFunction1(IEnumerable<Task> tasks){
await Task.WhenAll(tasks);
Console.WriteLine("all done"); // happens AFTER all tasks are finished
}
public async Task MyFunction2(IEnumerable<Task> tasks){
foreach(var task in tasks){
await task;
}
Console.WriteLine("all done"); // happens BEFORE all tasks are finished
}
foreach
会按照你描述的方式运行,因为你使用了await
等待所有任务完成(可能不如使用WhenAll
优化,但仍然是全部等待)。“在所有任务完成之前发生”这个表述看起来很奇怪,请问可以提供一个最小可复现示例(MCVE)来说明这种情况吗?根据你所描述的,你使用了await
等待所有任务完成,我无法理解为何foreach
会有此行为(虽然可能比使用WhenAll
更低效,但仍然是全部等待)。 - Alexei Levenkovreturn
在哪里? - Maria Ines Parnisarireturn
。 - Servy