在我公司的企业解决方案中,我正在检查并清除尽可能多的内存泄漏。
我们有一个 BaseCaptureForm,它被许多其他表单继承(例如,RecommendationCaptureForm)。在整个系统中(例如),此RecommendationCaptureForm 被模态调用(ShowDialog())。现在据我所知,当以模式方式打开表单时,它们应该被包装在 using 语句中或在完成后被丢弃。
BaseCaptureForm 中有一个永远不会被命中的 dispose 方法。我放入了一个终结器,但它也从未被击中。 ANTS Memory Profiler 显示所有这些形式都保留在内存中。
有人对我如何处理这些捕获表单(它们没有打开很长时间)以阻止内存泄漏有任何建议吗?整个系统有数百万次 ShowDialog 调用,我想知道是否还有其他人遇到过这个问题?
编辑 澄清一下,我可以在 BaseCaptureForm 中做些什么来在关闭后自动处理自己吗?我无法通过所有 ShowDialog() 调用来希望处理它们。 在表单的 OnClosed 事件中调用 dispose 方法会导致令人讨厌的闪烁。
最佳答案
根据表单关闭后 (*) 的使用方式,您可以从 FormClosed 事件处理程序中调用 Dispose()。
我没有看到您提到的“令人讨厌的闪烁”,您可以尝试的一件事是在 FormClosed 事件处理程序中设置 this.Visible = false
。
(*) 只要您不通过表单的公开可见属性或方法公开任何控件或控件的属性,您就可能是安全的。避免这种情况的一种方法是使用支持字段实现此类公共(public)属性,并在关闭表单之前将控件中的任何数据复制到这些支持字段中。
如果没有看到代码,就很难看出这在您的场景中是否现实。说实话,我倾向于硬着头皮通过添加 using
语句来清理调用。
关于c# - ShowDialog() 内存泄漏解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5718964/