Существуют следующие функции.
async Task<int> T1() { Console.WriteLine("T1"); return await Task.FromResult(1); }
async Task<string> T2() { Console.WriteLine("T2"); return await Task.FromResult("T2"); }
async Task<char> T3() { await Task.Delay(2000); Console.WriteLine("T3"); return await Task.FromResult('A'); }
async Task<string> T4() { Console.WriteLine("T4"); return await Task.FromResult("T4"); }
// U1, U2, U3, and U4 need to be run right after T1, T2, T3, and T4 respectively
void U1() { System.Threading.Thread.Sleep(1000); Console.WriteLine($"After T1"); }
void U2() { System.Threading.Thread.Sleep(4000); Console.WriteLine($"After T2"); }
void U3() { System.Threading.Thread.Sleep(1000); Console.WriteLine($"After T3"); }
void U4() { System.Threading.Thread.Sleep(1000); Console.WriteLine($"After T4"); }
// TAll() needs to be run as soon as T1, T2, T3, and T4 finished.
void TAll() { Console.WriteLine("To be run after T1, T2, T3, T4"); }
// All() runs after all functions are done.
void All() { Console.WriteLine("To be run after U1, U2, U3, U4"); }
Тем не менее, следующие звонки
var t1 = T1().ContinueWith(_ => U1());
var t2 = T2().ContinueWith(_ => U2());
var t3 = T3().ContinueWith(_ => U3());
var t4 = T4().ContinueWith(_ => U4());
await Task.WhenAll(t1, t2, t3, t4);
TAll();
All();
возвращает
T1
T2
T4
After T1
After T4
T3
After T3
After T2
To be run after T1, T2, T3, T4
To be run after U1, U2, U3, U4
Ожидаемый порядок вывода:
T1
T2
T4
After T1
After T4
T3
To be run after T1, T2, T3, T4
After T3
After T2
To be run after U1, U2, U3, U4