/ / ¿Puede la sesión de sesión disponer de un método al finalizar la sesión? - c #, asp.net-mvc

¿Puede la sesión de sesión disponer de un método al finalizar la sesión? - c #, asp.net-mvc

Quiero saber si los objetos IDisponibles se dispondrán al finalizar la sesión.

Lo sé, yo puedo disponer en el evento de finalización de sesión yo mismo. Pero quiero escribir una clase identificable.

Por ejemplo, tengo

public class MyObject : IDisposable
{
// some properties

public void Dispose()
{
// disposing
}
}

y necesito desechar este objeto en la hora de finalización de la sesión:

    protected void Session_End(object sender, EventArgs e)
{
if (Session["key"] != null)
((MyObject)Session["key"]).Dispose();
}

Por lo tanto, quiero saber en la hora de finalización de la sesión que la operación se realizará automáticamente o necesito escribir como se indica arriba.

Respuestas

3 para la respuesta № 1

Session_End no desecha automáticamente los objetos identificables, por lo que su solución Session_End es correcta.

Sin embargo:

  • Session_End solo se llama cuando se usan sesiones "inproc" (pero para los otros tipos necesitaría un objeto serializable)
  • Solo se llama después de que el tiempo de espera de la sesión haya expirado, por lo que mantuvo este recurso durante 20 minutos adicionales (o lo que sea su tiempo de espera)

Así que intente encontrar una solución que no requiera que almacene objetos IDisposibles en Session.


1 para la respuesta № 2

Una instancia de una clase que implementa el IDisposable La interfaz solo se "desechará" cuando llame al Dispose método, ya sea directa o indirectamente a través del using construir. No es algo que sucede automáticamente cada vez que un objeto queda fuera del alcance.

Por ejemplo, esto sería una mala práctica;

public void SomeMethodCalledDuringSession()
{
var resourceHog = new ResourceHog(); // where ResourceHog : IDisposable
// Perform operations
}

El objeto nunca se elimina correctamente aquí, independientemente de la finalización de su sesión ASP.NET. Sin embargo, puedes llamar Dispose directamente cuando hayas terminado, o una mejor idea es hacer esto;

public void SomeMethodCalledDuringSession()
{
using(var resourceHog = new ResourceHog()) // where ResourceHog : IDisposable
{
// Perform operations
}
}

Esto se traduce en una try ... finally patrón, con la llamada a Dispose en el finally cláusula, asegurándose de que se llame (aparte de algunas situaciones raras).

Editar: Yo también leería esto; http://nitoprograms.blogspot.co.uk/2009/08/how-to-implement-idisposable-and.html