4

I want to know if IDisposable objects will dispose on session ending.

I know, I can dispose on Session ending event myself. But I want to write an IDisposable class.

For example, I have

public class MyObject : IDisposable
{
    // some properties

    public void Dispose()
    {
        // disposing
    }
}

and I need to dispose this object on session ending time :

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

So, I want to know on session ending time that operation will automatically or I need write as above.

4

2 回答 2

4

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

然而:

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

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

于 2012-09-10T08:15:05.837 回答
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模式,Disposefinally子句中调用 to,确保它被调用(除了一些罕见的情况)。

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

于 2012-09-10T07:44:46.710 回答