pengaturcaraan asynchronous:
perbandingan dengan dan potensi kunci mati await
Task.WaitAll
Perbezaan antara dan
Task.Wait
await
Dalam adegan ini, kaedah "GET" dijangka mempunyai kebuntuan. Apakah sebab asas? Apakah perbezaan antara menggunakan halangan dan menunggu daripada
<code class="language-csharp">public async Task<string> Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task<string> Bar() { return await Foo(); } public async static Task<string> Ros() { return await Bar(); } public IEnumerable<string> Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray()); return new string[] { "value1", "value2" }; // 由于死锁而从未执行 }</code>
perbezaan: await Task.Delay
dan
Wait
dan await
akan menyekat benang semasa sehingga tugas selesai. Kaedah ini tidak dianjurkan kerana ia kelaparan kolam benang.
Task.Wait
await
Kunci mati yang berpotensi dan misi tak segerak Task.Wait
Dalam serpihan kod yang disediakan, kaedah "mendapatkan" panggilan await
, yang akan menyekat benang dan menunggu semua tugas selesai. Walau bagaimanapun, dalam tugas -tugas ini, kaedah "ROS" memanggil
. Ini akan menyebabkan kunci mati.
Task.WaitAll
Gunakan pengaturcaraan asynchronous untuk mengelakkan kunci mati
Untuk menyelesaikan masalah ini, pengaturcaraan asynchronous mesti digunakan, terutamanya apabila berurusan dengan tugas kelewatan dan penggantungan. Dengan menggabungkan penggunaan kata kunci dan Task.WaitAll
, kod itu dapat mengekalkan keupayaan tindak balas dan mencegah kunci mati. await Foo
Atas ialah kandungan terperinci Pengaturcaraan Async: `Task.waitall` Deadlock: Apa yang menyebabkannya dan bagaimanakah ia berbeza daripada menggunakan` menunggu`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!