await Task.WhenAll
dan bukannya berbilang await
? Apabila berurusan dengan tugas tak segerak, soalan biasa ialah sama ada anda perlu menggunakan await Task.WhenAll
dan bukannya berbilang await
pernyataan. Artikel ini meneroka kelebihan menggunakan Task.WhenAll
dalam senario tertentu.
Pertimbangkan kaedah berikut (DoWork1
dan DoWork2
) yang melaksanakan satu siri tugas tak segerak:
<code class="language-csharp">static async Task DoWork1() { await DoTaskAsync("t1.1", 3000); await DoTaskAsync("t1.2", 2000); await DoTaskAsync("t1.3", 1000); } static async Task DoWork2() { var t1 = DoTaskAsync("t2.1", 3000); var t2 = DoTaskAsync("t2.2", 2000); var t3 = DoTaskAsync("t2.3", 1000); await Task.WhenAll(t1, t2, t3); }</code>
Dalam kedua-dua kes, matlamatnya adalah untuk melaksanakan tugasan secara tidak segerak dan meneruskan pelaksanaan selepas semua tugasan selesai. Walau bagaimanapun, terdapat perbezaan utama antara kedua-dua pendekatan.
1. Ralat pengendalian:
Task.WhenAll
mempunyai kelebihan menyebarkan ralat untuk semua tugasan sekaligus. Dalam DoWork1
, jika mana-mana tugasan gagal, ralat ini akan hilang kerana ia akan ditimpa oleh kenyataan await
berikutnya. DoWork2
sebaliknya akan mengumpul dan memaparkan semua ralat yang berlaku semasa pelaksanaan tugas.
2. Semantik penyelesaian tugasan:
Task.WhenAll
Tunggu semua tugasan selesai, walaupun beberapa tugasan gagal atau dibatalkan. Ini jelas dalam situasi di mana tugas mungkin membuang pengecualian atau tamat masa. Dalam DoWork1
, jika satu tugasan gagal atau tamat tempoh, program meneruskan pelaksanaan tanpa menunggu tugasan lain. Ini boleh membawa kepada tingkah laku yang tidak dijangka dan keadaan bangsa.
3. Kebolehbacaan kod:
Menggunakan Task.WhenAll
meningkatkan kebolehbacaan kod anda kerana ia jelas menunjukkan niat untuk menunggu semua tugasan selesai. Ia merangkum aspek async menunggu kod, menjadikannya lebih mudah untuk memahami keseluruhan aliran pelaksanaan.
Atas ialah kandungan terperinci Bilakah Saya Harus Menggunakan `await Task.WhenAll` Daripada Berbilang Penyata `menunggu`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!