Memahami dan mencegah kebuntuan dalam async/menunggu C# C#'s /
memudahkan pengaturcaraan asynchronous, tetapi penggunaan yang tidak wajar boleh menyebabkan kebuntuan. Mari kita periksa senario biasa:
async
await
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(); }
kebuntuan timbul kerana , berjalan pada benang utama, secara serentak menunggu
untuk melengkapkan menggunakan. Walaupun ActionAsync
biasanya melepaskan benang, GetDataAsync
memaksa tunggu segerak. Secara kritis, .Result
berjalan dalam konteks benang utama. Apabila ia await
s .Result
, ia menangkap konteks dan menunggu untuk disambung semula. Tetapi benang utama disekat, menghalang GetDataAsync
dari penamat. Ini adalah kebuntuan klasik: benang utama menunggu await
, yang menunggu benang utama untuk melepaskan konteksnya. MyWebService.GetDataAsync
GetDataAsync
GetDataAsync
Pencegahan Deadlock:
Penyelesaiannya adalah untuk mengelakkan benang menyekat secara serentak apabila menggunakan /
. Sentiasa gunakan dalam async
kaedah untuk memastikan kesinambungan yang betul. Ini menghalang menyekat benang konteks, yang membolehkan operasi tak segerak selesai. Kod yang diperbetulkan akan kelihatan seperti ini: await
await
async
oleh
public async Task<ActionResult> ActionAsync() { // Correct: Awaiting the async task var data = await GetDataAsync(); return View(data); } private async Task<string> GetDataAsync() { // ... (remains unchanged) ... }
, kami membenarkan benang utama untuk terus memproses tugas -tugas lain sementara await
berjalan secara asynchronously. Ini menghilangkan kebuntuan. Ingat, GetDataAsync
kaedah harus dianggap sebagai operasi tak segerak dan dikendalikan dengan sewajarnya menggunakan ActionAsync
. GetDataAsync
Atas ialah kandungan terperinci Bagaimanakah async/menunggu kebuntuan berlaku di C#, dan bagaimanakah ia dapat dicegah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!