C # 's async
/ await
anahtar sözcüklerini kullanarak eşzamansız programlama için bazı en iyi uygulamalarla karşılaştım (c # 5.0'da yeniyim).
Verilen tavsiyelerden biri şöyleydi:
Kararlılık: Senkronizasyon bağlamlarınızı bilin
... Bazı senkronizasyon bağlamları evresel olmayan ve tek iş parçacıklıdır. Bu, bağlamda belirli bir zamanda yalnızca bir iş biriminin yürütülebileceği anlamına gelir. Buna bir örnek, Windows UI iş parçacığı veya ASP.NET istek bağlamıdır. Bu tek iş parçacıklı senkronizasyon bağlamlarında, kendinizi kilitlemek kolaydır. Tek iş parçacıklı bir bağlamdan bir görev oluşturursanız, bu görevi bağlamda bekleyin, bekleme kodunuz arka plan görevini engelliyor olabilir.
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();
}
Kendim incelemeye çalışırsam, ana iş parçacığı yeni bir tanesine doğar MyWebService.GetDataAsync();
, ancak ana iş parçacığı orada beklediği için sonucu bekler GetDataAsync().Result
. Bu arada, verilerin hazır olduğunu söyleyin. Ana iş parçacığı neden devam mantığına devam etmiyor ve bundan bir dize sonucu döndürmüyor GetDataAsync()
?
Biri bana yukarıdaki örnekte neden bir kilitlenme olduğunu açıklayabilir mi? Sorunun ne olduğu konusunda hiçbir fikrim yok ...