2009-01-31 17 views
7

En ASP.NET si los elementos se dejan en el estado de sesión Implementar IDisponible pero nunca son eliminados y eliminados específicamente por la aplicación cuando caduque la sesión Se llamará a Dispose sobre los objetos que cualquier código en Dipose () se ejecutará?Sesión que contiene elementos que implementan IDisposable

+0

Más respuestas a esta pregunta: http://stackoverflow.com/q/12347044/11683 – GSerg

Respuesta

2

Si el patrón IDisposable es implemented properly, entonces sí (es decir, el destructor de la clase se ocupará de eliminar el objeto). No creo que el administrador de sesión de ASP.NET haga ninguna garantía sobre llamar explícitamente al Dispose() en las clases que implementan IDisposable.

Tenga en cuenta que, a pesar de las objeciones agresivas de Mark, no estoy sugiriendo que se agreguen "de manera rutinaria" los finalizadores. Simplemente estoy sugiriendo que si quiere el método Dispose en su objeto llamado cuando la sesión expira, esta es una opción viable.

+2

Un finalizador es * no * una implementación IDisposable correcta; más bien, algo con un finalizador a menudo también puede ser IDisposable. Pero un objeto IDisposable no debe tener un finalizador solo porque es IDisposable. –

+0

No pensé que fuera "agresivo", simplemente que un finalizador no tiene nada que ver con si IDisposable está "implementado correctamente" –

+0

Diría que dejé un comentario negativo sobre mi respuesta, tergiversé mi respuesta y creé su propia respuesta que reitera su desacuerdo califica como una "objeción agresiva". Cualquiera de ellos habría sido suficiente por sí mismos. Supongo que tendremos que estar en desacuerdo sobre esto también. –

10

No estoy de acuerdo con la respuesta de Sean; en primer lugar, los finalizadores deberían no agregarse rutinariamente a las clases, incluso si son IDisposable - los finalizadores solo deberían usarse realmente en clases que representan recursos no administrados. Por el contrario, una clase con un finalizador a menudo también es IDisposable.

Re la pregunta: es Dispose() llamado - no, no lo es. El objeto será basura recolectada en algún momento en el futuro (indeterminado), pero eso es todo. Un finalizador no agregaría mucho aquí, ya que cualquier objeto encapsulado también será elegible para la recopilación (suponiendo que no se haga referencia a ellos en otro lugar).

1

Me preocuparía tener objetos desechables en la sesión. Es casi seguro que creará un problema de escalabilidad para usted. Todo lo que es Desechable probablemente esté conectado a algún recurso limitado; si tiene muchas sesiones activas, es probable que utilice ese recurso. En segundo lugar, esperaría que muchos (¿la mayoría?) Objetos desechables no funcionarían bien en una granja web, ya que el recurso al que están vinculados probablemente sea local para una sola máquina y no se serializarán y luego se deserializarán en otra máquina de la misma estado.

Cuestiones relacionadas