.NET Framework 4.5 のSystem.Net.Http.HttpClientとSystem.Net.Http.HttpClientHandlerは、( System.Net.Http.HttpMessageInvokerを介して) IDisposable を実装します。
using
ステートメントのドキュメントには次のように記載されています。
原則として、IDisposable オブジェクトを使用する場合は、using ステートメントで宣言してインスタンス化する必要があります。
この回答では、次のパターンを使用しています。
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
Dispose()
しかし、Microsoft からの最も目に見える例は、明示的または暗黙的に呼び出されません。例えば:
- HttpClient のリリースを発表した元のブログ記事。
- HttpClientの実際のMSDN ドキュメント。
- BingTranslateSample
- GoogleMapsサンプル
- 世界銀行サンプル
発表のコメントで、誰かが Microsoft の従業員に次のように尋ねました。
サンプルを確認したところ、HttpClient インスタンスで破棄アクションを実行していないことがわかりました。アプリで using ステートメントを使用して HttpClient のすべてのインスタンスを使用しましたが、HttpClient は IDisposable インターフェイスを実装しているため、これが正しい方法だと思いました。私は正しい道を進んでいますか?
彼の答えは次のとおりです。
一般的には正しいですが、.Net 4 では実際には混在しないため、「using」と async には注意する必要があります。.Net 4.5 では、「using」ステートメント内で「await」を使用できます。
ところで、同じ HttpClient を好きなだけ何度でも再利用できるので、通常、それらを常に作成/破棄することはありません。
2 番目の段落は、この質問には不要です。これは、HttpClient インスタンスを何回使用できるかについてではなく、不要になった後に破棄する必要があるかどうかについてです。
(更新: 実際、@DPeden によって以下に提供されているように、2 番目の段落が答えの鍵です。)
だから私の質問は:
現在の実装 (.NET Framework 4.5) では、HttpClient および HttpClientHandler インスタンスで Dispose() を呼び出す必要がありますか? 明確化: 「必要」とは、リソースの漏洩やデータ破損のリスクなど、処分しないことによる悪影響があるかどうかを意味します。
IDisposable を実装しているので、必要がない場合はとにかく「良い習慣」でしょうか?
必要な場合 (または推奨される場合)、上記のコードは安全に実装されていますか (.NET Framework 4.5 の場合)?
これらのクラスが Dispose() を呼び出す必要がない場合、なぜ IDisposable として実装されたのでしょうか?
必要な場合、または推奨される方法である場合、Microsoft の例は誤解を招くものまたは安全でないものですか?