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