System.Net.Http.HttpClient et System.Net.Http.HttpClientHandler dans .NET Framework 4.5 implémentent IDisposable (via System.Net.Http.HttpMessageInvoker ).
La using
documentation de la déclaration indique:
En règle générale, lorsque vous utilisez un objet IDisposable, vous devez le déclarer et l'instancier dans une instruction using.
Cette réponse utilise ce modèle:
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();
}
Mais les exemples les plus visibles de Microsoft n'appellent pas Dispose()
explicitement ou implicitement. Par exemple:
- L' article de blog original annonçant la relocalisation de HttpClient.
- La documentation MSDN réelle pour HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
Dans les commentaires de l' annonce , quelqu'un a demandé à l'employé de Microsoft:
Après avoir vérifié vos échantillons, j'ai vu que vous n'avez pas effectué l'action d'élimination sur l'instance HttpClient. J'ai utilisé toutes les instances de HttpClient avec l'instruction using sur mon application et j'ai pensé que c'était la bonne façon puisque HttpClient implémente l'interface IDisposable. Suis-je sur la bonne voie?
Sa réponse a été:
En général, c'est correct, bien que vous deviez faire attention à «utiliser» et asynchroniser car ils ne se mélangent pas vraiment dans .Net 4, dans .Net 4.5, vous pouvez utiliser «attendre» dans une instruction «using».
Btw, vous pouvez réutiliser le même HttpClient autant de fois que vous le souhaitez, donc généralement vous ne les créerez / supprimerez pas tout le temps.
Le deuxième paragraphe est superflu pour cette question, qui ne concerne pas le nombre de fois où vous pouvez utiliser une instance HttpClient, mais s'il est nécessaire de la supprimer une fois que vous n'en avez plus besoin.
(Mise à jour: en fait, le deuxième paragraphe est la clé de la réponse, comme indiqué ci-dessous par @DPeden.)
Mes questions sont donc:
Est-il nécessaire, compte tenu de l'implémentation actuelle (.NET Framework 4.5), d'appeler Dispose () sur les instances HttpClient et HttpClientHandler? Clarification: par "nécessaire", je veux dire s'il y a des conséquences négatives pour ne pas disposer, comme des risques de fuite de ressources ou de corruption de données.
Si ce n'est pas nécessaire, serait-ce de toute façon une "bonne pratique", puisqu'ils implémentent IDisposable?
S'il est nécessaire (ou recommandé), ce code mentionné ci-dessus le met-il en œuvre en toute sécurité (pour .NET Framework 4.5)?
Si ces classes ne nécessitent pas d'appeler Dispose (), pourquoi ont-elles été implémentées comme IDisposable?
S'ils l'exigent ou s'il s'agit d'une pratique recommandée, les exemples Microsoft sont-ils trompeurs ou dangereux?
Flush
un après chaque écriture, et à part l'inconvénient de continuer à conserver les ressources sous-jacentes plus longtemps que nécessaire, que ne se produira-t-il pas qui est requis pour un "comportement correct"?