24

我在发出 Web 请求时尝试使用 Async 和 Await,但发现它永远不会超过 await 行。我是从 Metro 应用程序中执行此操作的,但我也在 winforms 应用程序中验证了该问题。

public async Task<string> DoSomething()
{
    string url = "http://imgur.com/gallery/VcBfl.json";
    HttpWebRequest request = HttpWebRequest.CreateHttp(url);

    var ws = await request.GetResponseAsync();

    return ws.ResponseUri.ToString(); ;
}

如果我不使用 await 而是执行同步等待,它可以工作,但我需要它异步运行。

我在这段代码中遗漏了什么导致等待永远不会返回?

4

1 回答 1

38

我怀疑在你的调用堆栈中,你要么在调用,要么WaitResult返回的Task. 正如我在博客中所描述的那样,这将导致死锁

请遵循以下最佳实践来避免死锁:

  1. 不要阻塞async代码;一直使用async下去。
  2. 在您的“库”方法中,使用ConfigureAwait(false).
于 2012-10-03T04:31:15.243 回答