Saya menemukan beberapa praktik terbaik untuk pemrograman asinkron menggunakan c # 's async
/ await
keywords (Saya baru mengenal c # 5.0).
Salah satu saran yang diberikan adalah sebagai berikut:
Stabilitas: Ketahui konteks sinkronisasi Anda
... Beberapa konteks sinkronisasi non-reentrant dan single-threaded. Ini berarti hanya satu unit pekerjaan yang dapat dijalankan dalam konteks pada waktu tertentu. Contohnya adalah utas Windows UI atau konteks permintaan ASP.NET. Dalam konteks sinkronisasi utas tunggal ini, Anda mudah menemui jalan buntu. Jika Anda mengeluarkan tugas dari konteks utas tunggal, lalu menunggu tugas itu dalam konteks, kode tunggu Anda mungkin memblokir tugas latar belakang.
public ActionResult ActionAsync()
{
// DEADLOCK: this blocks on the async task
var data = GetDataAsync().Result;
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
Jika saya mencoba membedahnya sendiri, utas utama muncul ke utas baru MyWebService.GetDataAsync();
, tetapi karena utas utama menunggu di sana, utas utama menunggu hasilnya masuk GetDataAsync().Result
. Sementara itu, katakanlah data sudah siap. Mengapa utas utama tidak melanjutkan logika kelanjutannya dan mengembalikan hasil string dari GetDataAsync()
?
Adakah yang bisa menjelaskan kepada saya mengapa ada kebuntuan dalam contoh di atas? Saya benar-benar tidak tahu apa masalahnya ...