ShowDialog()内存泄漏解决方法

时间:2011-04-19 15:37:25

标签: c# memory memory-leaks showdialog

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

我们有一个BaseCaptureForm,它由许多其他形式继承(例如,RecommendationCaptureForm)。在整个系统中(例如),这个RecommendationCaptureForm被称为模态(ShowDialog())。现在据我所知,当表单以模态方式打开时,它们应该包含在using语句中或者在完成后处理。

BaseCaptureForm中有一个从未被命中的dispose方法。我放了一个终结器,它也永远不会被击中。 ANTS Memory Profiler显示所有这些表单都保留在内存中。

有没有人对我如何处理这些捕获表单(这些表格长期不开放)以阻止内存泄漏有任何建议?整个系统有数百万的ShowDialog调用,我想知道是否还有其他人遇到过这个问题?

修改 为了澄清,我可以在BaseCaptureForm中做些什么来在关闭后自动处理它自己?我无法通过所有ShowDialog()调用来希望处理它们。 在窗体的OnClosed事件中调用dispose方法会导致令人讨厌的闪烁。

3 个答案:

答案 0 :(得分:2)

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

我没有看到您提到的“讨厌的闪烁”,您可能尝试的一件事是在FormClosed事件处理程序中设置this.Visible = false

(*)只要您不通过公开可见的属性或表单方法暴露任何控件或控件属性,您就可以安全。避免这种情况的一种方法是使用支持字段实现此类公共属性,并在关闭表单之前将控件中的任何数据复制到这些支持字段中。

如果没有看到代码,很难看出这在你的场景中是否真实。说实话,我倾向于通过添加using语句来咬紧牙关并清理呼叫。

答案 1 :(得分:1)

如果永远不会调用对话框的处理,则这可能是表单中抛出的异常的指示符。看一下这个blogpost

您是否实施了"Ms Dispose Pattern"? 哪个甚至可以帮助您的解决方案。也许你可以提供一些代码?

希望这对你有帮助......

答案 2 :(得分:1)

不幸的是,没有简单的方法可以做到这一点。你所拥有的是糟糕的代码,并且必须像所有其他糟糕的代码一样纠正错误的代码:通过修复它并用良好的代码替换它。这里没有适用的创可贴;创可贴是Form调用Dispose()的终结者,永远不会保证发生。如果该对象没有资格进行收集,那么ANTS Memory Profiler将向您显示对其进行引用的内容。