2012-10-03 206 views
20

我试图使用异步和等待做Web请求时,我发现它永远不会过去的等待线。我从Metro应用程序执行此操作,但我也在Winforms应用程序中验证了这个问题。异步和等待与HttpWebRequest.GetResponseAsync

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,而是执行同步等待,它可以工作,但我需要这个异步运行。

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

回答

30

我怀疑进一步向上调用堆栈,您要么在返回的Task上调用WaitResultThis will cause a deadlock, as I describe on my blog

遵循这些最佳实践,避免死锁:

  1. 不要async代码块;一直使用async
  2. 在您的“库”方法中,使用ConfigureAwait(false)
+2

谢谢。这就是它。感谢您的链接,这是非常有帮助的。 –

+0

@Stephen,感谢您的博客文章!澄清问题:如果我在我的lib(基本上是WebClient)中使用'.ConfigureAwait(false)',我可以在调用它时使用'.Result'吗?它似乎工作,但我不知道当我在野外放松时会发生什么。 – Brad

+0

@Brad:是的,只要你调用的异步方法做同样的事情。但是,使用'Result'不是最佳做法;总有更好的选择。 –