Async Deadlocks dalam C#: Isu konteks penyegerakan
C#'s/async
memudahkan pengaturcaraan asynchronous, tetapi pengendalian konteks penyegerakan yang tidak betul boleh menyebabkan kebuntuan. Konteks Penyegerakan Pastikan kod berjalan pada benang yang betul, tetapi masalah timbul dengan konteks bukan reentrant atau satu-satunya seperti benang UI atau konteks permintaan ASP.NET. await
<code class="language-csharp">public ActionResult ActionAsync() { var data = GetDataAsync().Result; // Blocking call! return View(data); } private async Task<string> GetDataAsync() { var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
blok semasa menunggu ActionAsync
. GetDataAsync
sendiri menanti tugas latar belakang. Ini mewujudkan kebuntuan: benang utama (dalam GetDataAsync
) disekat, menghalang tugas latar belakang daripada menyelesaikan, yang seterusnya menghalang ActionAsync
dari penamat, mengakibatkan kebuntuan kekal. GetDataAsync
dalam await
, menjadikannya bergantung kepada penyempurnaan benang utama. Oleh kerana benang utama disekat, kebergantungan ini menghalang GetDataAsync
dari menyelesaikan. GetDataAsync
kaedah. Gunakan teknik tidak menyekat seperti pengundian atau panggilan balik untuk penyegerakan. Bukan async
, gunakan .Result
dalam await
untuk menyelesaikan contoh khusus ini. ActionAsync
Atas ialah kandungan terperinci Bagaimanakah kebuntuan asynchronous berlaku dalam C#'async`/`menunggu` dan bagaimana mereka boleh dielakkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!