2009-01-31 6 views
7

Dans ASP.NET, si des éléments sont laissés dans l'état de session Implémenter IDisposable mais ne sont jamais spécifiquement supprimés et éliminés par l'application à l'expiration de la session, Dispose sera appelé sur les objets de Dipose () va s'exécuter?Session contenant des éléments implémentant IDisposable

+0

Plus de réponses à cette question: http://stackoverflow.com/q/12347044/11683 – GSerg

Répondre

2

Si le motif IDisposable est implemented properly, alors oui (c'est-à-dire que le destructeur de la classe prendra soin de disposer l'objet). Je ne crois pas que le gestionnaire de session ASP.NET donne des garanties sur l'appel explicite Dispose() sur les classes implémentant IDisposable. Notez que malgré les objections agressives de Mark, je ne suggère pas d'ajouter "de façon routinière" les finaliseurs. Je suggère simplement que si vous voulez la méthode Dispose sur votre objet appelé lorsque la session expire, ceci est une option viable.

+2

Un finaliseur n'est * pas * une implémentation IDisposable correcte; plutôt, quelque chose avec un finaliseur peut souvent aussi être IDisposable. Mais un objet IDisposable ne devrait pas avoir de finaliseur juste parce qu'il est IDisposable. –

+0

Je ne pensais pas que c'était "agressif" - simplement qu'un finaliseur n'a rien à voir avec le fait qu'IDisposable soit "implémenté correctement" –

+0

Je dirais laisser un commentaire négatif sur ma réponse, déformer ma réponse, et créer votre propre réponse qui réitère votre désaccord qualifie comme une «objection agressive». N'importe lequel d'entre eux aurait été suffisant en eux-mêmes. Je suppose que nous devrons simplement être en désaccord sur celui-ci aussi. –

10

Je ne suis pas d'accord avec la réponse de Sean; premièrement, les finaliseurs et non doivent être régulièrement ajoutés aux classes, même s'ils sont IDisposable - les finaliseurs ne devraient être réellement utilisés que dans les classes représentant des ressources non gérées. Inversement, une classe avec un finaliseur est souvent IDisposable.

Re la question: est Dispose() appelé - non, il ne l'est pas. L'objet sera ramassé à un moment donné dans le futur (indéterminé), mais c'est à peu près tout. Un finaliseur n'ajouterait pas grand-chose ici, car tous les objets encapsulés seront également déjà éligibles à la collecte (en supposant qu'ils ne sont pas référencés ailleurs).

1

Je serais concerné d'avoir des objets jetables dans la session. Il va presque certainement créer un problème d'évolutivité pour vous. Tout ce qui est jetable est probablement connecté à une ressource limitée, si vous avez beaucoup de sessions actives, vous êtes susceptible d'utiliser cette ressource. Deuxièmement je m'attendrais à ce que beaucoup (la plupart?) D'objets jetables ne fonctionnent pas bien dans une ferme de Web car la ressource à laquelle ils sont liés est probablement locale à une seule machine et ils ne sérialiseront pas et désérialiseront alors sur une autre machine dans la même machine Etat.

Questions connexes