经过几个小时的挣扎之后,我在我的应用程序中发现了一个错误。我认为下面的两个函数具有相同的行为,但事实证明它们没有。Task.WhenAll()和foreach(任务中的var任务)之间的差异
任何人都可以告诉我什么是真正发生在引擎盖下,为什么他们的行为以不同的方式?
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
}
“发生之前的所有任务完成”看上去很奇怪 - 你可以有[MCVE],显示这种情况?我没有看到为什么“foreach”会按照您在等待所有任务时描述的方式行事(可能不如“WhenAll”最佳,但仍然全部)。 –
该代码甚至没有编译。 'return'在哪里? –
'WhenAll'和在一个循环中手动等待它们的一般区别在于,后者将不断地来回切换到异步方法,需要大量的上下文切换,而前者在内部等待它们而没有那开销。 – poke