導(dǎo)致死鎖的異步/等待示例我遇到了一些使用c#進(jìn)行異步編程的最佳實(shí)踐。async/await關(guān)鍵詞(我是c#5.0的新手)。其中一項(xiàng)建議如下:穩(wěn)定性:了解同步上下文..一些同步上下文是不可重入和單線程的.這意味著在給定的時間內(nèi)只能在上下文中執(zhí)行一個工作單元。這方面的一個例子是Windows UI線程或ASP.NET請求上下文。在這些單線程同步上下文中,您自己很容易陷入死鎖。如果從單線程上下文派生任務(wù),則在上下文中等待該任務(wù),等待代碼可能會阻塞后臺任務(wù)。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();}如果我試圖親自剖析它,主線程就會生成一個新線程。MyWebService.GetDataAsync();,但是由于主線程在那里等待,所以它將等待GetDataAsync().Result..同時,說數(shù)據(jù)已經(jīng)準(zhǔn)備好了。為什么主線程不繼續(xù)它的延續(xù)邏輯并返回一個字符串GetDataAsync() ?請有人解釋一下,為什么在上面的例子中會出現(xiàn)死鎖?我完全不知道問題出在哪里.
- 3 回答
- 0 關(guān)注
- 632 瀏覽
添加回答
舉報(bào)
0/150
提交
取消