Müssen HttpClient und HttpClientHandler entsorgt werden?

System.Net.Http.HttpClient und System.Net.Http.HttpClientHandler.NET Framework 4.5 implementieren Sie IDisposable (über System.Net.Http.HttpMessageInvoker).

Den using Anweisung-Dokumentation sagt:

Regel, wenn Sie ein IDisposable-Objekt, sollten Sie erklären und
instanziieren Sie in einer using-Anweisung.

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();
}

Aber die offensichtlichsten Beispiele von Microsoft nicht aufrufen Dispose() entweder explizit oder implizit. Zum Beispiel:

In der Ankündigung's Kommentaren hat jemand gefragt, die Microsoft-Mitarbeiter:

Nach Prüfung der Proben, sah ich, dass Sie nicht führen Sie die Entsorgung
Aktion auf HttpClient-Instanz. Ich habe alle Instanzen von HttpClient
mit der using-Anweisung auf mein app, und ich dachte, dass dies der richtige Weg ist
da HttpClient implementiert die IDisposable-Schnittstelle. Ich bin auf der
richtigen Weg?

Seine Antwort war:

In der Regel, dass richtig ist, obwohl Sie müssen vorsichtig sein mit
"mit" und "async", da Sie nicht wirklich in .Net 4, In .Net 4.5
verwenden können, "erwarten" innen "using" - Anweisung.

Btw, können Sie die Wiederverwendung der gleichen HttpClient wie viele Male sind [wie] Sie wie so
in der Regel werden Sie nicht schaffen/entsorgen Sie die ganze Zeit.

Dem zweiten Absatz ist überflüssig, auf diese Frage, die ist nicht besorgt darüber, wie viele Male Sie können ein HttpClient-Instanz, sondern um wenn es notwendig ist, entsorgen Sie es nach Sie es nicht mehr benötigen.

(Update: in der Tat, dass der zweite Absatz ist der Schlüssel zur Antwort, wie weiter unten von @DPeden.)

Also meine Fragen sind:

  1. Ist es notwendig, angesichts der aktuellen Implementierung (.NET Framework 4.5), zum Aufruf von Dispose() HttpClient und HttpClientHandler Instanzen? Klarstellung: mit "notwendig" meine ich, ob es irgendwelche negativen Konsequenzen, wenn man nicht entsorgen, wie die Ressource Leckage oder Beschädigung von Daten Risiken.
  2. Wenn es nicht notwendig ist, wäre es ein "good practice" wie auch immer, da Sie IDisposable implementieren?
  3. Wenn es erforderlich (oder empfohlen), ist dieser code oben genannten Umsetzung ist es sicher (für .NET Framework 4.5)?
  4. Wenn diese Klassen nicht erforderlich, der Aufruf von Dispose(), warum wurden Sie implementiert IDisposable?
  5. Wenn Sie erforderlich ist, oder wenn es empfohlen wird, sind die Microsoft-Beispiele irreführender oder unsicher?

InformationsquelleAutor der Frage Fernando Correia | 2013-03-29

Schreibe einen Kommentar