导致死锁的异步/等待示例我遇到了一些使用c#进行异步编程的最佳实践。async/await关键词(我是c#5.0的新手)。其中一项建议如下:稳定性:了解同步上下文..一些同步上下文是不可重入和单线程的.这意味着在给定的时间内只能在上下文中执行一个工作单元。这方面的一个例子是Windows UI线程或ASP.NET请求上下文。在这些单线程同步上下文中,您自己很容易陷入死锁。如果从单线程上下文派生任务,则在上下文中等待该任务,等待代码可能会阻塞后台任务。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..同时,说数据已经准备好了。为什么主线程不继续它的延续逻辑并返回一个字符串GetDataAsync() ?请有人解释一下,为什么在上面的例子中会出现死锁?我完全不知道问题出在哪里.
3 回答
- 3 回答
- 0 关注
- 595 浏览
添加回答
举报
0/150
提交
取消