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

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

我遇到了一些使用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() ?

请有人解释一下,为什么在上面的例子中会出现死锁?我完全不知道问题出在哪里.


qq_笑_17
浏览 596回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP