kebuntuan dalam async/menunggu: contoh praktikal
C#'s/async
memudahkan pengaturcaraan asynchronous, meningkatkan kebolehbacaan kod. Walau bagaimanapun, mengabaikan konteks penyegerakan boleh menyebabkan kebuntuan. Artikel ini mengkaji senario kebuntuan yang sama dan menawarkan penyelesaian. await
Memahami masalah kebuntuan
Perangkap yang kerap dalam pengaturcaraan tak segerak melibatkan kebuntuan dalam konteks penyegerakan tunggal, bukan reentran seperti Windows UI Thread atau Konteks Permintaan ASP.NET.Pertimbangkan kod ini:
<code class="language-csharp">public ActionResult ActionAsync() { // DEADLOCK: Blocking on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // Simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
Analisis Deadlock
thread utama memulakan dan segera blok menggunakan GetDataAsync()
, menunggu siap. Tugas latar belakang dari .Result
percubaan pelaksanaan. Kerana konteks penyegerakan tunggal-threaded, benang utama memegang konteks, menghalang tugas latar belakang dari berterusan. GetDataAsync()
disekat sehingga benang konteks dikeluarkan (oleh benang utama), sementara benang utama terhenti, menunggu GetDataAsync()
untuk menyelesaikan -pergantungan bulat. GetDataAsync()
Penyelesaian: Mencegah kebuntuan
Ikuti garis panduan ini untuk mengelakkan kebuntuan:
async
dengan bijak. Elakkan menyekat operasi asynchronous dalam UI atau meminta benang konteks. await
Kesimpulan
/Async
dengan ketara meningkatkan kod tak segerak. Walau bagaimanapun, pemahaman konteks penyegerakan adalah penting untuk mengelakkan kebuntuan. Dengan mengikuti amalan terbaik, pemaju boleh membuat aplikasi asynchronous yang mantap dan boleh dipercayai. await
Atas ialah kandungan terperinci Bagaimanakah kebuntuan dapat dielakkan apabila menggunakan async/menunggu di C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!