Apa perbedaan antara Task.WaitAll()
dan Task.WhenAll()
dari CTP Async? Bisakah Anda memberikan beberapa kode sampel untuk menggambarkan berbagai kasus penggunaan?
c#
asynchronous
async-await
task-parallel-library
Yaron Levi
sumber
sumber
WhenAll
, tapi itu tidak sama dengan memblokir utas.Sementara jawaban JonSkeet menjelaskan perbedaan dalam cara yang biasanya sangat baik ada perbedaan lain: penanganan pengecualian .
Task.WaitAll
melemparAggregateException
ketika salah satu tugas melempar dan Anda dapat memeriksa semua pengecualian yang dilemparkan. Theawait
diawait Task.WhenAll
unwraps yangAggregateException
dan 'kembali' hanya pengecualian pertama.Ketika program di bawah ini dijalankan dengan
await Task.WhenAll(taskArray)
output adalah sebagai berikut.Ketika program di bawah ini dijalankan dengan
Task.WaitAll(taskArray)
output adalah sebagai berikut.Program:
sumber
await t1; await t2; await t3;
vsawait Task.WhenAll(t1,t2,t3);
await
, bukan perbedaan antara dua metode. Keduanya menyebarkanAggregateException
, baik melempar secara langsung atau melalui properti (Task.Exception
properti).Sebagai contoh perbedaan - jika Anda memiliki tugas, lakukan sesuatu dengan utas UI (mis. Tugas yang mewakili animasi di Storyboard) jika Anda
Task.WaitAll()
maka utas UI diblokir dan UI tidak pernah diperbarui. jika Anda gunakanawait Task.WhenAll()
maka utas UI tidak diblokir, dan UI akan diperbarui.sumber
Apa yang mereka lakukan:
Apa bedanya:
Gunakan kapan:
sumber
WaitAll
apa yang saya mengerti.Task.WaitAll
setelah melakukan beberapa pekerjaan lain? Maksud saya, alih-alih memanggilnya segera setelah memulai tugas Anda.