System.Net.Http.HttpClient y System.Net.Http.HttpClientHandler en .NET Framework 4.5 implementan IDisposable (a través de System.Net.Http.HttpMessageInvoker ).
La using
documentación de la declaración dice:
Como regla general, cuando usa un objeto IDisposable, debe declararlo e instanciarlo en una declaración de uso.
Esta respuesta usa este patrón:
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();
}
Pero los ejemplos más visibles de Microsoft no llaman Dispose()
explícita o implícitamente. Por ejemplo:
- El artículo original del blog que anuncia la transmisión de HttpClient.
- La documentación real de MSDN para HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
En los comentarios del anuncio , alguien le preguntó al empleado de Microsoft:
Después de verificar sus muestras, vi que no realizó la acción de eliminación en la instancia de HttpClient. He usado todas las instancias de HttpClient con el uso de la declaración en mi aplicación y pensé que es la forma correcta ya que HttpClient implementa la interfaz IDisposable. ¿Estoy en el camino correcto?
Su respuesta fue:
En general, eso es correcto, aunque debe tener cuidado con "usar" y asíncrono ya que realmente no se mezclan en .Net 4, en .Net 4.5 puede usar "esperar" dentro de una declaración "usar".
Por cierto, puede reutilizar el mismo HttpClient tantas veces como desee, por lo que normalmente no los creará / eliminará todo el tiempo.
El segundo párrafo es superfluo para esta pregunta, que no le preocupa cuántas veces puede usar una instancia de HttpClient, sino si es necesario deshacerse de ella después de que ya no la necesite.
(Actualización: de hecho, el segundo párrafo es la clave de la respuesta, como se proporciona a continuación por @DPeden).
Entonces mis preguntas son:
¿Es necesario, dada la implementación actual (.NET Framework 4.5), llamar a Dispose () en instancias HttpClient y HttpClientHandler? Aclaración: por "necesario" me refiero a si hay consecuencias negativas por no deshacerse, como la fuga de recursos o los riesgos de corrupción de datos.
Si no es necesario, ¿sería una "buena práctica" de todos modos, ya que implementan IDisposable?
Si es necesario (o recomendado), ¿ este código mencionado anteriormente lo implementa de manera segura (para .NET Framework 4.5)?
Si estas clases no requieren llamar a Dispose (), ¿por qué se implementaron como IDisposable?
Si lo requieren, o si es una práctica recomendada, ¿son los ejemplos de Microsoft engañosos o inseguros?
Flush
a uno después de cada escritura, y aparte del inconveniente de que continúe reteniendo los recursos subyacentes durante más tiempo del necesario, ¿qué no ocurrirá que sea necesario para un "comportamiento correcto"?