Rumah >pembangunan bahagian belakang >C++ >`menunggu` vs` tugas.result`: Bilakah anda harus menggunakan masing -masing dan mengapa seseorang menyebabkan kebuntuan?
dan : Penggunaan penggunaan yang berbeza dan penyebab kebuntuan await
Task.Result
Apabila memproses kod asynchronous, adalah penting untuk memahami perbezaan antara
untuk mendapatkan hasil. Kekeliruan boleh menyebabkan kunci mati, terutamanya apabila menggunakan API yang melaksanakan kaedah asynchronous. await
Task.Result
Pertimbangkan adegan ujian berikut:
Dalam ujian ini, kami mula -mula cuba menggunakan
<code class="language-csharp">[Test] public async void CheckStatusTwiceResultTest() { Assert.IsTrue(CheckStatus().Result); // 此处挂起 Assert.IsTrue(await CheckStatus()); }</code>dari kaedah asynchronous
untuk mendapatkan hasilnya. Walau bagaimanapun, kaedah ini akan digantung kerana kita sebenarnya melakukan penyempurnaan misi dalam penyegerakan dan menyekat benang pelaksanaan. Task.Result
CheckStatus
untuk memahami mengapa ini berlaku, kita perlu menyemak kaedah
CheckStatus
<code class="language-csharp">private async Task<bool> CheckStatus() { // 进行 REST API 调用 IRestResponse<dummyservicestatus> response = await restResponse; return response.Data.SystemRunning; }</code>, ia sebenarnya akan menghalang benang pelaksanaan dan menunggu hasilnya.
await
kerana kaedah itu sendiri mengandungi operasi tak segerak (panggilan API REST), mencuba Task.Result
penantian segerak akan menyebabkan kunci mati. Benang pelaksanaan utama sedang menunggu hasil panggilan API, dan panggilan API sedang menunggu benang utama untuk terus melaksanakan.
Kaedah yang betul untuk mengakses hasil kaedah asynchronous adalah menggunakan CheckStatus
kata kunci, seperti yang ditunjukkan dalam ujian berikut: Task.Result
di sini, kami menggunakan await
untuk melepaskan benang pelaksanaan, yang membolehkan API memanggil Asynchronous untuk diselesaikan. Selepas operasi selesai, lakukan pemulihan dan dapatkan hasil dari tugas tanpa menyebabkan kunci mati.
<code class="language-csharp">[Test] public async void CheckOnceAwaitTest() { Assert.IsTrue(await CheckStatus()); }</code>harus dielakkan apabila menggunakan kaedah asynchronous kerana ia boleh menyebabkan kunci mati.
Kata kunci harus digunakan untuk melepaskan benang dan mencegah masalah tersebut. await
Atas ialah kandungan terperinci `menunggu` vs` tugas.result`: Bilakah anda harus menggunakan masing -masing dan mengapa seseorang menyebabkan kebuntuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!