web-dev-qa-db-fra.com

Pourquoi y a-t-il besoin d'une méthode Dispose () explicite dans les contrôleurs asp.net MVC? Quelqu'un peut-il expliquer ses subtilités? (spécifique asp.net)

Je sais que C # peut gérer assez bien les ressources avec son garbage collector. Mais puisqu'il a cela, à quoi cela sert-il exactement et pourquoi est-il nécessaire?

Quelqu'un peut-il expliquer pourquoi .Dispose() est nécessaire dans asp.net mvc?

En outre, que signifie éliminer une connexion? Pourquoi est-il nécessaire? Quelqu'un connaît les subtilités de la raison pour laquelle il est important de disposer d'une connexion à la base de données comme dans db.Dispose()? Est-ce lié à EF ou à SQL Server? J'essaie de comprendre exactement pourquoi.

protected override void Dispose(bool disposing)
{
   db.Dispose();
   base.Dispose(disposing);
}
29
Jan Carlo Viray

Dispose sert à libérer des ressources "non gérées" (par exemple, des sockets, des descripteurs de fichiers, des descripteurs Bitmap, etc.), et s'il est appelé en dehors d'un finaliseur (c'est ce que l'indicateur disposing signifie, BTW ), pour disposer d'autres objets IDisposables qu'il contient et qui ne sont plus utiles.

Les ressources "non gérées" ne sont pas gérées par le CLR (d'où le nom), et GC ne les dérange pas et ne les libère pas tout seul; en l'absence d'une méthode Dispose (et du code l'utilisant réellement!), elle s'appuiera sur le finaliseur de l'objet pour nettoyer. Finalement, le finaliseur fonctionnera (si l'application est saine et l'objet a un finaliseur), et si le finaliseur fait son travail, alors tout est semi OK ... mais cela prendra son temps ce faisant - et si vous manquez de poignées en attendant, eh bien. Dommage pour cet autre thread/processus/tout ce qui en avait besoin.

Si vous Dispose, cependant, les ressources sont libérées immédiatement et les choses fonctionnent mieux tout autour.

(Soit dit en passant, cela n'est pas limité à EF, SQL Server ou à toute autre technologie. Le modèle jetable se trouve dans l'ensemble du framework .net, et il est considéré comme une bonne pratique d'en tirer parti chaque fois que vous avez un IDisposable qui n'est plus utilisé.)

Quant à savoir pourquoi IDisposable est implémenté si haut dans l'arborescence, plutôt que de l'implémenter au cas par cas ... je ne suis pas sûr à 100%. Mais imaginez que vous écriviez un cadre. Considérez que si tout n'était pas un IDisposable, vous devriez vérifier - chaque fois que vous vouliez vous débarrasser de quelque chose! - si l'objet est jetable et Dispose si c'est le cas. Cependant, si vous implémentez IDisposable "au cas où", les choses sont simplifiées - vous disposez toujours toujours. (Si un objet n'a rien à nettoyer, il ne remplace simplement pas Dispose - auquel cas le Dispose de son parent est appelé et fait tout le nettoyage qu'il doit, ce qui peut rien de plus ...) Et c'est un cas assez courant pour que les contrôleurs aient du matériel à nettoyer, que même si ce n'est pas la vraie raison, il est très logique de le faire de toute façon.

28
cHao