为了账号安全,请及时绑定邮箱和手机立即绑定

导致死锁的异步/等待示例

导致死锁的异步/等待示例

qq_笑_17 2019-06-06 15:27:04
导致死锁的异步/等待示例我遇到了一些使用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
提交
取消
意见反馈 帮助中心 APP下载
官方微信