2

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

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

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

有没有人对我如何处理这些捕获表单(它们不会长时间打开)以停止泄漏内存有任何建议?整个系统中有数百万次 ShowDialog 调用,我想知道是否还有其他人遇到过这个问题?

编辑 澄清一下,我可以在 BaseCaptureForm 中做些什么来在关闭后自动处理自己吗?我无法通过所有 ShowDialog() 调用来处理它们。在表单的 OnClosed 事件中调用 dispose 方法会导致令人讨厌的闪烁。

4

3 回答 3

2

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

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

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

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

于 2011-04-19T16:39:16.843 回答
1

如果从未调用过 dispose 对话框,这可能表明您的表单中抛出了异常。看看这篇博文

您是否实施了“Ms Dispose Pattern”?这甚至可以帮助您解决问题。也许你可以提供一些代码?

希望这可以对你有所帮助...

于 2011-04-19T15:48:33.853 回答
1

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

于 2011-04-19T19:32:58.647 回答