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 № 1Session_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