Kedua jawaban tidak menyebutkan yang ditunggu-tunggu Task.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
Perbedaan utama antara Task.WaitAll
dan Task.WhenAll
adalah bahwa yang pertama akan memblokir (mirip dengan menggunakan Wait
pada satu tugas) sedangkan yang terakhir tidak akan dan dapat ditunggu, menghasilkan kontrol kembali ke pemanggil sampai semua tugas selesai.
Lebih dari itu, penanganan pengecualian berbeda:
Task.WaitAll
:
Setidaknya satu instance Task dibatalkan - atau pengecualian dilemparkan selama eksekusi setidaknya satu instance Task. Jika tugas dibatalkan, AggregateException berisi OperationCanceledException dalam koleksi InnerExceptions-nya.
Task.WhenAll
:
Jika salah satu dari tugas yang disediakan menyelesaikan dalam kondisi yang salah, tugas yang dikembalikan juga akan selesai dalam keadaan yang salah, di mana pengecualiannya akan berisi agregasi dari set pengecualian yang terbuka dari masing-masing tugas yang disediakan.
Jika tidak ada tugas yang diberikan salah tetapi setidaknya salah satu dari mereka dibatalkan, tugas yang dikembalikan akan berakhir pada status Dibatalkan.
Jika tidak ada tugas yang salah dan tidak ada tugas yang dibatalkan, tugas yang dihasilkan akan berakhir pada status RanToCompletion. Jika array / enumerable yang disediakan tidak berisi tugas, tugas yang dikembalikan akan segera beralih ke status RanToCompletion sebelum dikembalikan ke pemanggil.
await Task.WhenAll(task1, task2);
?