Memahami Async/Tunggu Deadlocks Dalam C#
Pengaturcaraan moden sangat bergantung pada operasi asynchronous, dan kata kunci C Walau bagaimanapun, penggunaan yang tidak betul boleh menyebabkan kebuntuan. Mari kita periksa senario biasa:
async
Pertimbangkan contoh ini: await
Kod ini cuba untuk mendapatkan data secara tidak segerak tetapi serentak menunggu keputusan menggunakan
, mewujudkan kebuntuan. Kebuntuan timbul seperti berikut:<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 asynchronous method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
.Result
ActionAsync
GetDataAsync
memulakan permintaan web tak segerak melalui GetDataAsync
MyWebService.GetDataAsync
Mengembalikan tugas yang tidak lengkap. MyWebService.GetDataAsync
menangguhkan, mengembalikan tugas yang tidak lengkap kepada GetDataAsync
ActionAsync
blok pada tugas yang tidak lengkap dari ActionAsync
Permintaan web akhirnya selesai, menyambung semula GetDataAsync
. GetDataAsync
memerlukan benang konteks, yang disekat oleh GetDataAsync
kebuntuan berlaku: ActionAsync
menunggu ActionAsync
GetDataAsync
Ini menggambarkan kepentingan kritikal untuk mengelakkan penantian segerak pada operasi tak segerak dalam kaedah asynchronous. Sentiasa biarkan operasi tak segerak disiapkan secara semulajadi, menggunakan Atas ialah kandungan terperinci Bagaimanakah async/menunggu membawa kepada kebuntuan di C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!