System.Net.Http.HttpClient e System.Net.Http.HttpClientHandler no .NET Framework 4.5 implementam IDisposable (via System.Net.Http.HttpMessageInvoker ).
A using
documentação da declaração diz:
Como regra, quando você usa um objeto IDisposable, você deve declarar e instancia-lo em uma instrução using.
Esta resposta usa este padrão:
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();
}
Mas os exemplos mais visíveis da Microsoft não chamam Dispose()
explícita ou implicitamente. Por exemplo:
- O artigo original do blog anunciando a relase do HttpClient.
- A documentação real do MSDN para HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
Nos comentários do anúncio , alguém perguntou ao funcionário da Microsoft:
Depois de verificar suas amostras, vi que você não executou a ação de disposição na instância HttpClient. Eu usei todas as instâncias do HttpClient com a declaração using no meu aplicativo e achei que era o caminho certo, já que o HttpClient implementa a interface IDisposable. Estou no caminho certo?
Sua resposta foi:
Em geral, isso está correto, embora você tenha que ter cuidado com "using" e assíncrono, pois eles realmente não se misturam no .Net 4. No .Net 4.5, você pode usar "waitit" dentro de uma instrução "using".
Aliás, você pode reutilizar o mesmo HttpClient quantas vezes quiser [normalmente], assim normalmente você não os cria / descarta o tempo todo.
O segundo parágrafo é supérfluo para essa pergunta, que não se preocupa com quantas vezes você pode usar uma instância HttpClient, mas se é necessário descartá-la depois que você não precisar mais dela.
(Atualização: na verdade, o segundo parágrafo é a chave da resposta, conforme fornecido abaixo pelo @DPeden.)
Então, minhas perguntas são:
É necessária, dada a implementação atual (.NET Framework 4.5), chamar Dispose () nas instâncias HttpClient e HttpClientHandler? Esclarecimento: por "necessário", quero dizer se existem consequências negativas por não descartar, como vazamento de recursos ou riscos de corrupção de dados.
Se não for necessário, seria uma "boa prática", já que eles implementam IDisposable?
Se for necessário (ou recomendado), esse código mencionado acima está implementando-o com segurança (no .NET Framework 4.5)?
Se essas classes não exigem a chamada Dispose (), por que elas foram implementadas como IDisposable?
Se eles exigirem ou se for uma prática recomendada, os exemplos da Microsoft são enganosos ou inseguros?
Flush
um após cada gravação e, além do inconveniente de continuar mantendo os recursos subjacentes por mais tempo do que o necessário, o que não ocorrerá necessário para o "comportamento correto"?