System.Net.Http.HttpClient e System.Net.Http.HttpClientHandler in .NET Framework 4.5 implementano IDisposable (tramite System.Net.Http.HttpMessageInvoker ).
La using
documentazione della dichiarazione dice:
Di norma, quando si utilizza un oggetto IDisposable, è necessario dichiararlo e creare un'istanza in un'istruzione using.
Questa risposta utilizza questo modello:
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();
}
Ma gli esempi più visibili di Microsoft non chiamano Dispose()
né esplicitamente né implicitamente. Per esempio:
- L' articolo originale del blog in cui viene annunciato il rilascio di HttpClient.
- La documentazione MSDN effettiva per HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
Nei commenti dell'annuncio , qualcuno ha chiesto al dipendente Microsoft:
Dopo aver controllato i tuoi campioni, ho visto che non hai eseguito l'azione di eliminazione sull'istanza di HttpClient. Ho usato tutte le istanze di HttpClient con l'utilizzo dell'istruzione sulla mia app e ho pensato che fosse la strada giusta poiché HttpClient implementa l'interfaccia IDisposable. Sono sulla buona strada?
La sua risposta fu:
In generale questo è corretto, anche se devi stare attento con "utilizzo" e asincrono in quanto non si mescolano realmente in .Net 4, In .Net 4.5 puoi usare "wait" all'interno di un'istruzione "using".
A proposito, puoi riutilizzare lo stesso HttpClient quante volte [come] ti piace, quindi in genere non li creerai / eliminerai sempre.
Il secondo paragrafo è superfluo a questa domanda, che non si preoccupa di quante volte è possibile utilizzare un'istanza di HttpClient, ma di se è necessario smaltirla dopo che non è più necessaria.
(Aggiornamento: in effetti quel secondo paragrafo è la chiave della risposta, come indicato di seguito da @DPeden.)
Quindi le mie domande sono:
È necessario, data l'attuale implementazione (.NET Framework 4.5), chiamare Dispose () su istanze HttpClient e HttpClientHandler? Chiarimento: per "necessario" intendo se ci sono conseguenze negative per il mancato smaltimento, come perdite di risorse o rischi di corruzione dei dati.
Se non fosse necessario, sarebbe comunque una "buona pratica", poiché implementano IDisposable?
Se è necessario (o consigliato), questo codice è menzionato sopra implementandolo in modo sicuro (per .NET Framework 4.5)?
Se queste classi non richiedono la chiamata a Dispose (), perché sono state implementate come IDisposable?
Se lo richiedono o se è una pratica consigliata, gli esempi Microsoft sono fuorvianti o non sicuri?
Flush
a uno dopo ogni scrittura e, a parte l'inconveniente che continua a trattenere le risorse sottostanti più a lungo del necessario, cosa non accadrà che è richiesto per un "comportamento corretto"?