可以在会话结束时间调用会话方法吗?

时间:2012-09-10 07:27:36

标签: c# asp.net-mvc

我想知道IDisposable对象是否会在会话结束时处理。

我知道,我可以自己处理Session结束事件。但我想写一个IDisposable类。

例如,我有

public class MyObject : IDisposable
{
    // some properties

    public void Dispose()
    {
        // disposing
    }
}

我需要在会话结束时间处理此对象:

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

所以,我想在会话结束时间知道操作将自动执行,或者我需要按上述方式编写。

2 个答案:

答案 0 :(得分:3)

Session_End不会自动处理IDisposable对象,因此您的Session_End解决方案是正确的。

然而:

  • Session_End仅在您使用" inproc"会话(但对于其他类型,您需要一个可序列化的对象)
  • 仅在会话超时到期后才会调用它,因此您将此资源保留了20分钟(或者超时):

因此,请尝试找到一个不需要您在Session中存储IDisposable对象的解决方案。

答案 1 :(得分:1)

实现IDisposable接口的类的实例只有在您调用Dispose方法时才会“处置”,无论是直接还是间接通过using构造。当对象超出范围时,它不会自动发生。

例如,这将是不好的做法;

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

无论您的ASP.NET会话结束如何,此处的对象永远不会正确处理。但是,您可以在完成后直接致电Dispose,或者更好的方法是这样做;

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

这转换为try ... finally模式,在Dispose子句中调用finally,确保调用它(除少数情况外)。

编辑:我也会读到这个; http://nitoprograms.blogspot.co.uk/2009/08/how-to-implement-idisposable-and.html