HttpWebRequest.GetResponseAsyncを使用した非同期と待機
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を使用せず、代わりに同期待機を実行する場合は機能しますが、非同期で実行するにはこれが必要です。
このコードで、awaitが戻らない原因は何ですか?
コールスタックをさらに進めて、返されたWait
でResult
またはTask
を呼び出していると思われます。 これは私のブログで説明しているように、デッドロックを引き起こします 。
デッドロックを回避するには、次のベストプラクティスに従ってください。
async
コードでブロックしないでください。async
を最後まで使用してください。- 「ライブラリ」メソッドで、
ConfigureAwait(false)
を使用します。