包含实现IDisposable的项目的会话

时间:2009-01-31 02:41:31

标签: c# asp.net session garbage-collection idisposable

在ASP.NET中,如果项目保留在实现IDisposable的会话状态但是在会话到期时从未被应用程序专门删除和处理,则会在对象上调用Dispose,以执行Dipose()中的任何代码吗? / p>

3 个答案:

答案 0 :(得分:10)

我不同意肖恩的回答;首先,终结器应该定期添加到类中,即使它们是IDisposable - 终结器应该只用于表示非托管资源的类中。相反,带有终结器的类通常也是IDisposable

回答问题:是Dispose()被叫 - 不,不是。该对象将在未来的某个时刻被收集(不确定),但这就是它。终结器在这里不会增加太多,因为任何封装的对象也已经有资格进行收集(假设它们没有在别处引用)。

答案 1 :(得分:2)

如果IDisposable模式为implemented properly,则为yes(即类的析构函数将负责处理对象)。我不相信ASP.NET会话管理器对在实现Dispose()的类上显式调用IDisposable做出任何保证。

请注意,尽管马克强烈反对,我并不是建议“定期”添加终结者。我只是建议,如果您希望在会话到期时调用对象上的Dispose方法,这是一个可行的选项。

答案 2 :(得分:1)

我担心会话中有Disposable对象。它几乎肯定会为您创建可伸缩性问题。任何Disposable都可能与某些有限的资源相关联,如果您有许多活动会话,则可能会占用该资源。其次,我希望许多(大多数?)一次性对象在Web场中不能很好地工作,因为它们所依赖的资源可能是单个机器本地的,并且它们不会在同一台机器上序列化然后反序列化状态。