5
导致死锁的异步/等待示例
我遇到了一些使用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()? 有人可以解释一下为什么上面的示例中出现死锁吗?我完全不知道问题是什么...