Async和Await与HttpWebRequest.GetResponseAsync

Joh*_*ner 21 c# httpwebrequest async-await windows-8 windows-runtime

我正在尝试在发出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(); ;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*ary 34

我怀疑你的呼叫堆栈越来越大,你要么是在呼叫,Wait要么Result是在返回Task.正如我在博客中描述的那样,这将导致死锁.

请遵循以下最佳做法以避免死锁:

  1. 不要阻止async代码; 一直使用async.
  2. 在您的"库"方法中,使用ConfigureAwait(false).

  • 谢谢.就是这样.感谢您的链接,这是非常有帮助的. (3认同)
  • @Brad:由于异步代码的性质,这是不可能的.最好一直使用异步. (2认同)