2012-10-03 93 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'不是最佳做法;總有更好的選擇。 –