System.Net.Http.HttpClientおよびSystem.Net.Http.HttpClientHandler.NET Framework 4.5のは、IDisposableを実装します(System.Net.Http.HttpMessageInvokerを介して)。
の 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()
、明示的または暗黙的に。例えば:
- の オリジナルのブログ記事のHttpClientのrelaseを発表。
- 実際の HttpClient MSDNドキュメント。
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
で発表のコメント、誰かがマイクロソフトの従業員に尋ねました:
サンプルを確認したところ、HttpClientインスタンスで破棄アクションを実行していないことがわかりました。私はアプリのusingステートメントでHttpClientのすべてのインスタンスを使用しましたが、HttpClientがIDisposableインターフェイスを実装しているため、これは正しい方法だと思いました。私は正しい道を進んでいますか?
彼の答えは:
一般にそれは正しいですが、「使用」と非同期には注意が必要ですが、.Net 4では実際には混合されないため、.Net 4.5では「使用」ステートメント内で「待機」を使用できます。
ところで、同じHttpClientは何度でも再利用できるため、通常は常に作成/破棄することはありません。
2番目の段落は、HttpClientインスタンスを何回使用できるかという問題ではなく、不要になった後に破棄する必要があるかどうかについては、この質問には不要です。
(更新:実際には、下の@DPedenで提供されているように、2番目の段落が回答の鍵となります。)
だから私の質問は:
現在の実装(.NET Framework 4.5)では、HttpClientおよびHttpClientHandlerインスタンスでDispose()を呼び出す必要がありますか?明確化:「必要」とは、リソースの漏洩やデータの破損のリスクなど、処分しないことによる悪影響があるかどうかを意味します。
彼らがIDisposableを実装しているので、それが必要でない場合でも、とにかく「良い習慣」でしょうか?
必要な(または推奨される)場合、上記のこのコードはそれを安全に実装していますか(.NET Framework 4.5の場合)?
これらのクラスがDispose()を呼び出す必要がない場合、なぜそれらがIDisposableとして実装されたのですか?
彼らが必要とする場合、またはそれが推奨される実践である場合、Microsoftの例は誤解を招く、または安全ではないのですか?
Flush
書き込みごとに1回呼び出すことができます。また、必要以上に基礎となるリソースを保持し続けるという不便さを除けば、「正しい動作」に必要な何が発生しないのでしょうか。