会话结束时间会话呼叫处理方法吗?

我想知道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(); } 

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

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

然而:

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

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

实现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模式,在finally子句中调用Dispose ,确保它被调用(除了少数几种情况)。

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