Rumah >pembangunan bahagian belakang >C++ >Mengapa pencampuran `menunggu` dan` .Result` dalam operasi async C# menyebabkan kebuntuan?
dan penyebab kebuntuan await
.Result
Apabila menggunakan operasi asynchronous di C#, adalah penting untuk memahami potensi perangkap penyegerakan campuran dan panggilan tak segerak. Dalam contoh ini, disebabkan oleh baris kod berikut, ujian terakhir digantung akibat kunci mati:
Alasan untuk kebuntuan
<code class="language-csharp">Assert.IsTrue(CheckStatus().Result); // 导致挂起</code>
adalah kaedah asynchronous yang mengembalikan tugas jenis boolean.
CheckStatus()
Result
Ini membawa kepada kebuntuan: Kaedah Asynchronous cuba meneruskan pelaksanaan pada benang utama, dan benang utama sedang menunggu tugas selesai. Kod berikut menunjukkan penggunaan yang betul :
await
Elakkan secara langsung memanggil
await
<code class="language-csharp">[Test] public async Task CheckStatusTwiceResultTest() { Assert.IsTrue(await CheckStatus()); Assert.IsTrue(await CheckStatus()); }</code>atau
secara langsung pada tugas. Sebaliknya, bergantung pada mod untuk memastikan operasi tak segerak dilakukan di dalam bukan blocking.
Result
Kesimpulan
Dengan memahami potensi akibat pencampuran penyegerakan dan panggilan tak segerak, pemaju dapat menggunakan kaedah tak segerak dalam C#tanpa menghadapi masalah mati atau masalah prestasi. Result
Atas ialah kandungan terperinci Mengapa pencampuran `menunggu` dan` .Result` dalam operasi async C# menyebabkan kebuntuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!