Ne HttpClient et HttpClientHandler doivent être éliminés?

Système.Net.Http.HttpClient et Système.Net.Http.HttpClientHandler dans .NET Framework 4.5 mettre en œuvre IDisposable (via Système.Net.Http.HttpMessageInvoker).

La using déclaration de documentation dit:

En règle générale, lorsque vous utilisez un IDisposable objet, vous devez déclarer et
l'instancier dans une instruction d'utilisation.

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 connus de Microsoft n'appelez pas Dispose() que ce soit explicitement ou implicitement. Par exemple:

Dans le annonceles commentaires, quelqu'un a demandé à l'employé de Microsoft:

Après vérification de vos échantillons, j'ai vu que vous n'avez pas réussi à l'éliminer
action sur HttpClient instance. J'ai utilisé toutes les instances de HttpClient
avec l'aide de déclaration sur mon application et j'ai pensé que c'est la bonne façon
depuis HttpClient implémente l'interface IDisposable. Suis-je sur la
droit chemin?

Sa réponse a été:

En général c'est correct, bien que vous devez être prudent avec les
"à l'aide de" et asynchrone comme ils ne sont pas vraiment mélanger .Net 4, Dans .Net 4.5 vous
pouvez utiliser "en attente" à l'intérieur d'une "aide" de la déclaration.

Btw, vous pouvez réutiliser la même HttpClient autant de fois sont [comme] vous aimez, de sorte
en général, vous n'aurez pas créer/débarrasser d'eux tout le temps.

Le deuxième paragraphe est inutile à cette question, qui n'est pas préoccupé par la façon dont beaucoup de temps vous pouvez utiliser un HttpClient exemple, mais si il est nécessaire de se débarrasser une fois que vous n'en avez plus besoin.

(Mise à jour: en fait, c', deuxième alinéa, est la clé de la réponse, comme prévu ci-dessous par @DPeden.)

Donc mes questions sont:

  1. Est-il nécessaire, étant donné le contexte actuel de mise en œuvre (.NET Framework 4.5), pour appeler dispose() sur HttpClient et HttpClientHandler instances? Précision: par "nécessaire", je veux dire s'il y a des conséquences négatives pour ne pas disposer des ressources, par exemple les fuites de données ou les risques de corruption.

  2. Si il n'est pas nécessaire, serait-ce une "bonne pratique" de toute façon, puisqu'ils mettent en œuvre IDisposable?

  3. Si c'est nécessaire (ou recommandé), est ce code mentionné ci-dessus de la mettre en œuvre en toute sécurité (par .NET Framework 4.5)?

  4. Si ces classes ne nécessitent pas d'appeler dispose(), pourquoi ont-ils été mis en œuvre comme IDisposable?

  5. Si ils ont besoin, ou si c'est une pratique recommandée, Microsoft exemples trompeuse ou dangereux?

  • "Si elle n'est pas absolument nécessaire..." - il n'est jamais "absolument nécessaire" pour disposer de tout Jetable. De la même manière qu'il n'est pas "absolument nécessaire" pour vous débarrasser de vos déchets de façon responsable si vous êtes en visite à la maison d'autrui.
  • merci pour vos commentaires. Avez-vous des suggestions sur comment je pourrais préciser la question? Je veux savoir si elle peut conduire à des problèmes généralement associés à ne pas disposer de ressources, tels que la fuite de ressources et la corruption des données.
  • Pas vrai. En particulier, les flux les écrivains doivent être disposées à avoir des comportement correct.
  • Je suppose que je ne vois pas le point de l'ensemble de la question. Vous êtes au courant qu'ils mettent en œuvre le modèle jetable. Vous êtes conscient de ce que vous (en tant que bon citoyen/consommateur) sont destinés à faire avec un objet jetable lorsque vous n'en avez plus besoin. Vous êtes également conscient que l'attente est que l'un de ces objets peut être utilisé pour de multiples demandes, de sorte que vous êtes peu probable de voir des exemples que tout simplement en créer un, d'envoyer une seule demande, et puis immédiatement se débarrasser de lui.
  • quels sont les aspects que vous envisagez de vous? Certainement, vous pouvez appeler Flush sur un après chaque écriture, et d'autres que les inconvénients de celle-ci en continuant à maintenir les ressources sous-jacentes pour plus longtemps que nécessaire, ce qui ne se produira pas qui est nécessaire pour "comportement correct"?
  • dans le code que j'ai l'habitude d'écrire, j'ai créer un nouveau HttpClient exemple quand j'ai besoin d'envoyer une nouvelle demande au lieu de garder ce client exemple autour. Je pense qu'il se trouve bien avec les apatrides de la nature du protocole HTTP. Mais je n'ai habituellement pas de disposer de ces instances, et aujourd'hui seulement, j'ai remarqué qu'ils mettent en œuvre IDisposable. C'est pourquoi j'essaie de savoir si je suis attendu à les disposer de manière explicite. J'espère que précise ma question.
  • Il ne semble pas être une évidence de réponse claire à cette question. Considérant qu'il doit être l'un des plus utilisés .net classes dans l'internet moderne du monde, je trouve ça assez étrange que MSDN n'a pas clairement précisé comment il doit être utilisé.
  • C'est simplement faux: "en règle générale, lorsque vous utilisez un IDisposable objet, vous devez déclarer et instancier dans une instruction d'utilisation". Je voudrais lire la documentation de la classe de mise en œuvre IDisposable toujours avant de décider si je dois utiliser une aide pour elle. Comme l'auteur de bibliothèques où je mettre en œuvre IDisposable parce que le besoin de libérer unmanged ressources, je serais horrifié si les consommateurs créé disposé d'une instance à chaque fois, au lieu de ré-utiliser une instance existante. Cela ne veut pas dire ne pas jeter de l'instance finalement..
  • J'ai soumis un PR de microsoft pour mettre à jour leurs docs: github.com/dotnet/docs/pull/2470
  • Le jetable modèle est nécessaire à l'apprentissage du C# .net 4.5 certification. La confusion réside dans la compatibilité avec des .net 2.0-utilisation de idisposible (comme avec la mémoire des ruisseaux et des IEnumerable). Vous devez veiller à disposer est appelée immédiatement après avoir terminé de l'utiliser pour tout ce qui encapsule “ ressources externes”. Fichier sont un bon exemple. Lorsqu'un client http (par question) lit un fichier, même si vous exécutez chasse d'eau, une longue verrou est maintenu. Sur votre système de GC nettoyer rapidement. Sur un autre, qui sait. Ou en tant que vos changements de l'environnement. Mo un jour, il ne peut pas être écrit.