【问题标题】:.NET WinForms application not releasing components?.NET WinForms 应用程序不发布组件?
【发布时间】:2010-12-13 23:40:42
【问题描述】:

我正在使用 C# 中的 .NET 2.0 WinForms 应用程序。

在我的应用程序拆除过程中,我注意到一些我认为很奇怪的事情。在设计器生成的 dispose 方法中:

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    } 

components 确实包含一些项目时,我看到它正在传递disposing = false 参数。这让我相信这些资源没有被正确处理/释放,因为components.Dispose(); 没有被调用。这是曾经想要的行为吗?

谢谢。

【问题讨论】:

  • 这种情况是从垃圾收集器(终结器/析构器)调用的吗?

标签: c# .net components dispose


【解决方案1】:

如果从终结器调用 Dispose(bool),则 disposing 参数将作为 false 传递。这通常发生在 Dispose() 未被调用时。


Dispose(bool) 方法实际上并不是 IDisposable 的一部分; IDisposable.Dispose()Object.Finalize() 都使用它。约定是IDisposable.Dispose() 将调用Dispose(true)Object.Finalize() 将调用Dipose(false)

【讨论】:

  • 它是否曾被隐式调用为 true?
【解决方案2】:

也许您的类需要处理非托管资源并因此也实现了终结器?

类似这样的:

   ~MyForm()
    {
       this.Dispose(false);
    }

【讨论】:

    【解决方案3】:

    如果在最终确定期间调用 Dispose(false) 本身就可以。如果表单正在完成,则包含的控件也将在完成队列中,并且在它们上调用 Dispose() 至少是多余的。

    但是 Form 正在被最终确定的事实意味着没有对其调用确定性 Dispose() ,并且应该对其本身进行调查。正如您所说,除非在应用程序关闭时发生这种情况。那么它是无害的。

    【讨论】:

    • 我正在调查的表单实际上是一个对话框,所以在这个表单关闭后,整个应用程序仍然在运行。结果,组件永远不会被收集,因为只要垃圾收集器开始传递到此对话框表单,就会调用 Dispose(false)。在对话框表单关闭后,我添加了对 Form.Dispose() 的显式调用。添加了一些断点,并且看,Dispose(true) 被调用并且组件(工具提示/计时器)被正确删除。谢谢解释!
    猜你喜欢
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多