ShowDialog()内存泄漏解决方案

本文关键字:泄漏 解决方案 内存 ShowDialog | 更新日期: 2023-09-27 17:50:38

在我公司的企业解决方案中,我正在检查并清除尽可能多的内存泄漏。

我们有一个由许多其他表单继承的BaseCaptureForm(例如,推荐captureform)。在整个系统中(例如),这个推荐性captureform被模态地调用(ShowDialog())。现在,据我所知,当窗体被模态打开时,它们应该被包装在using语句中,或者在完成时被丢弃。

在BaseCaptureForm中有一个处置方法,它永远不会被击中。我放入了一个finalizer,它也不会被击中。ANTS内存分析器显示所有这些形式都保留在内存中。

有没有人有任何建议,我如何去处置这些捕获形式(这不是开放了那么长时间),以停止泄漏内存?整个系统中有数百万个ShowDialog调用,我想知道是否有人遇到了这个问题?

编辑澄清一下,我可以在BaseCaptureForm中做一些事情来自动处理自己一旦关闭?我不能遍历所有的ShowDialog()调用,希望能够处理它们。在窗体的OnClosed事件中调用dispose方法会导致令人讨厌的闪烁。

ShowDialog()内存泄漏解决方案

根据窗体关闭后的使用方式(*),您可以在FormClosed事件处理程序中调用Dispose()。

我没有看到你提到的"讨厌的闪烁",你可以尝试在FormClosed事件处理程序中设置this.Visible = false

(*)你可能是安全的,只要你不暴露任何控件或控件的属性通过公开可见的属性或方法的窗体。避免这种情况的一种方法是实现带有支持字段的公共属性,并在窗体关闭之前将控件中的任何数据复制到这些支持字段中。

如果没有看到代码,很难看出这在您的场景中是否现实。老实说,我倾向于咬紧牙关,通过添加using语句来清理调用。

不幸的是,没有简单的方法可以做到这一点。你所拥有的是糟糕的代码,而这些糟糕的代码必须像所有其他糟糕的代码一样被纠正:通过修复它并用好的代码替换它。这里没有什么创可贴;创可贴是Form调用Dispose()的终结器,它永远不能保证发生。如果对象不适合收集,那么ANTS内存分析器将显示是什么占用了对它的引用。

如果从未调用dispose对话框,这可能是在表单中抛出异常的指示符。看一看这篇博文。

您是否实现了"Ms Dispose模式"?这甚至可以帮助你解决问题。也许你可以提供一些代码?