System.Net.Http.HttpClient i System.Net.Http.HttpClientHandler w .NET Framework 4.5 implementują IDisposable (przez System.Net.Http.HttpMessageInvoker ).
Dokumentacja using
oświadczenia mówi:
Z reguły, gdy używasz obiektu IDisposable, powinieneś zadeklarować go i utworzyć jego instancję w instrukcji using.
Ta odpowiedź wykorzystuje ten wzorzec:
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();
}
Ale najbardziej widoczne przykłady firmy Microsoft nie wywołują Dispose()
ani jawnie, ani niejawnie. Na przykład:
- Oryginalny artykuł napisany ogłaszając wypuścić z HttpClient.
- Rzeczywista dokumentacja MSDN dla HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
W zapowiedź „s komentarze, ktoś poprosił pracownika firmy Microsoft:
Po sprawdzeniu próbek zauważyłem, że nie wykonałeś operacji usuwania na instancji HttpClient. Użyłem wszystkich wystąpień HttpClient z użyciem instrukcji w mojej aplikacji i pomyślałem, że jest to właściwy sposób, ponieważ HttpClient implementuje interfejs IDisposable. Czy jestem na dobrej drodze?
Jego odpowiedź brzmiała:
Zasadniczo jest to poprawne, chociaż trzeba uważać na „używanie” i asynchronizację, ponieważ tak naprawdę nie mieszają się one w .Net 4, w .Net 4.5 można użyć „czekaj” wewnątrz instrukcji „using”.
Przy okazji, możesz ponownie użyć tego samego klienta HttpClient tyle razy, ile chcesz, więc zazwyczaj nie będziesz ich tworzyć / usuwać przez cały czas.
Drugi akapit jest zbędny w stosunku do tego pytania, które nie martwi się, ile razy można użyć instancji HttpClient, ale o tym, czy konieczne jest usunięcie go, gdy już go nie potrzebujesz.
(Aktualizacja: w rzeczywistości ten drugi akapit jest kluczem do odpowiedzi, jak podano poniżej przez @DPeden.)
Więc moje pytania to:
Czy w obecnej wersji (.NET Framework 4.5) konieczne jest wywołanie metody Dispose () w instancjach HttpClient i HttpClientHandler? Wyjaśnienie: przez „konieczne” mam na myśli, jeśli istnieją negatywne konsekwencje braku wyrzucenia, takie jak wyciek zasobów lub ryzyko uszkodzenia danych.
Jeśli nie jest to konieczne, czy byłaby to „dobra praktyka”, ponieważ implementują one IDisposable?
Jeśli jest to konieczne (lub zalecane), czy wspomniany powyżej kod bezpiecznie go implementuje (dla .NET Framework 4.5)?
Jeśli te klasy nie wymagają wywołania Dispose (), dlaczego zostały zaimplementowane jako IDisposable?
Jeśli wymagają lub jeśli jest to zalecana praktyka, czy przykłady Microsoft wprowadzają w błąd lub są niebezpieczne?
Flush
jeden po każdym zapisie, a poza niedogodnościami związanymi z utrzymywaniem podstawowych zasobów dłużej niż to konieczne, co się nie stanie, co jest wymagane do „prawidłowego zachowania”?