System.Net.Http.HttpClient und System.Net.Http.HttpClientHandler in .NET Framework 4.5 implementieren IDisposable (über System.Net.Http.HttpMessageInvoker ).
In der using
Anweisungsdokumentation heißt es:
Wenn Sie ein IDisposable-Objekt verwenden, sollten Sie es in der Regel in einer using-Anweisung deklarieren und instanziieren.
Diese Antwort verwendet dieses Muster:
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();
}
Die sichtbarsten Beispiele von Microsoft rufen jedoch Dispose()
weder explizit noch implizit auf. Zum Beispiel:
- Der ursprüngliche Blog-Artikel , der die Veröffentlichung von HttpClient ankündigt.
- Die aktuelle MSDN-Dokumentation für HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
In den Kommentaren der Ankündigung fragte jemand den Microsoft-Mitarbeiter:
Nachdem ich Ihre Beispiele überprüft hatte, stellte ich fest, dass Sie die Dispose-Aktion für die HttpClient-Instanz nicht ausgeführt haben. Ich habe alle Instanzen von HttpClient mit using-Anweisungen in meiner App verwendet und dachte, dass dies der richtige Weg ist, da HttpClient die IDisposable-Schnittstelle implementiert. Bin ich auf dem richtigen Weg?
Seine Antwort war:
Im Allgemeinen ist das richtig, obwohl Sie mit "using" und async vorsichtig sein müssen, da sie sich nicht wirklich in .Net 4 mischen. In .Net 4.5 können Sie "await" in einer "using" -Anweisung verwenden.
Übrigens können Sie denselben HttpClient so oft wiederverwenden, wie Sie möchten, sodass Sie ihn normalerweise nicht immer erstellen / entsorgen.
Der zweite Absatz ist für diese Frage überflüssig. Dabei geht es nicht darum, wie oft Sie eine HttpClient-Instanz verwenden können, sondern darum, ob sie entsorgt werden muss, nachdem Sie sie nicht mehr benötigen.
(Update: Tatsächlich ist dieser zweite Absatz der Schlüssel zur Antwort, wie unten von @DPeden bereitgestellt.)
Meine Fragen sind also:
Ist es angesichts der aktuellen Implementierung (.NET Framework 4.5) erforderlich, Dispose () für HttpClient- und HttpClientHandler-Instanzen aufzurufen? Klarstellung: Mit "notwendig" meine ich, wenn es negative Konsequenzen für die Nichtentsorgung gibt, wie z. B. Ressourcenverlust oder Datenkorruptionsrisiken.
Wenn es nicht notwendig ist, wäre es trotzdem eine "gute Praxis", da sie IDisposable implementieren?
Wenn es notwendig (oder empfohlen) ist, implementiert dieser oben erwähnte Code ihn sicher (für .NET Framework 4.5)?
Wenn für diese Klassen kein Aufruf von Dispose () erforderlich ist, warum wurden sie dann als IDisposable implementiert?
Sind die Microsoft-Beispiele irreführend oder unsicher, wenn sie erforderlich sind oder wenn dies empfohlen wird?
Flush
nach jedem Schreibvorgang einen aufrufen , und abgesehen von der Unannehmlichkeit, die zugrunde liegenden Ressourcen länger als nötig zu halten, was wird nicht passieren, das für "korrektes Verhalten" erforderlich ist?