經過幾個小時的掙扎之後,我在我的應用程序中發現了一個錯誤。我認爲下面的兩個函數具有相同的行爲,但事實證明它們沒有。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