async
インスタンスを返すメソッドに対してIDisposable
呼び出しを行っている状況があります。例えば:
HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));
async
が登場する前に、IDisposable
インスタンスを操作する場合、「response」変数を使用したこの呼び出しとコードはusingステートメントでラップされます。
私の質問は、async
キーワードがミックスでスローされたとき、それがまだ正しいアプローチであるかどうかです。コードはコンパイルされますが、usingステートメントは以下の両方の例で期待どおりに機能しますか?
例1
using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
// Do something with the response
return true;
}
例2
using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
await this.responseLogger.LogResponseAsync(response);
return true;
}
はい、それは問題ないはずです。
最初の場合、あなたは本当に言っています:
2番目のケースでは、次のように言っています:
非同期メソッドのusing
ステートメントは「_odd」であり、Dispose
呼び出しはリソースを取得したスレッドとは異なるスレッドで実行される可能性があります(同期コンテキストなどによって異なります)起こります...あなたが待っているものを仮定するとeverが現れるか、もちろん失敗します。 (Dispose
ステートメントに戻り値のないメソッドの呼び出しが含まれている場合、非同期コードでusing
を呼び出すことにならないように。)