2012-10-03 33 views
20

Webリクエストを行うときにAsyncとAwaitを使用しようとしていて、待っている回線を決して通過できないことがわかっています。私は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を使用せず、代わりに同期待機を実行すると動作しますが、非同期で実行する必要があります。

このコードには、何も返されません。

答えて

30

あなたの呼び出しスタックをさらに上げると思われる場合は、返されたTaskWaitまたはResultを呼び出していると思います。 This 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

@ブラッド:はい、呼び出している非同期メソッドが同じことをしている限りです。しかし、 'Result'を使うのはベストプラクティスではありません。常により良い選択肢があります。 –