【问题标题】:Session containing items implementing IDisposable包含实现 IDisposable 的项目的会话
【发布时间】:2009-01-31 02:41:31
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

问题是:Dispose() 是否被调用 - 不,不是。该对象将在将来的某个时候(不确定)被垃圾收集,但仅此而已。终结器不会在这里添加太多,因为任何封装的对象也已经可以收集(假设它们没有在其他地方引用)。

【讨论】:

    【解决方案2】:

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

    请注意,尽管 Mark 强烈反对,但我并不是建议“常规”添加终结器。我只是建议,如果您想要在会话到期时调用对象上的 Dispose 方法,这是一个可行的选择。

    【讨论】:

    • 终结器不是正确的 IDisposable 实现;相反,带有终结器的东西通常也可能是 IDisposable。但是 IDisposable 对象不应该仅仅因为它是 IDisposable 就具有终结器。
    • 我不认为这是“激进的” - 只是终结器与 IDisposable 是否“正确实施”无关
    • 我想说的是对我的回答发表负面评论,歪曲我的回答,并创建自己的回答来重申你的分歧,这就是“激进的反对”。其中任何一个本身就足够了。我想我们也只能在这个问题上不同意。
    • 我将我的类标记为已密封,并向其添加了一个只调用 Dispose() 的终结器,如果我的 dispose 方法被多次调用它已经处理状态检查也没关系。然后在我的使用过程中,我添加了一个 Session.Abandon 并看到它确实在处理它。
    【解决方案3】:

    我担心在 Session 中有 Disposable 对象。它几乎肯定会给您带来可扩展性问题。任何一次性的东西都可能连接到一些有限的资源,如果您有许多活动会话,您可能会用完该资源。其次,我希望许多(大多数?)一次性对象在网络场中无法正常工作,因为它们所绑定的资源可能是单台机器的本地资源,并且它们不会在同一台机器上序列化然后反序列化状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 2011-07-31
      • 2019-03-11
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多