使用对话框表单周围的语句来确保垃圾回收

我们有一个包含数千个表单的Windows窗体应用程序。

其中许多通过ShowDialog()方法临时显示为对话框。

这个应用程序已存在多年,我们发现由于表单中的各种资源泄漏或它使用的控件,许多表单没有及时收集垃圾。

具体来说,我们已经找到了未正确处理的GDI +资源的示例,尽管可能存在尚未表征的其他类型的资源泄漏。

虽然解决这个问题的正确方法显然是要经历每一种forms和每一种控制,并消除所有的资源问题。 这需要一些时间来完成。

作为一个短期的替代方案,我们发现在表单上显式调用Dispose()似乎启动了垃圾收集过程,并且表单及其资源立即被释放。

我的问题是,在一个using语句中包装每个表单的ShowDialog()块是否是一个合理的解决方法,以便在显示表单后调用Dispose(),这也是一个很好的做法吗?

例如,从以下位置更改现有代码:

public void ShowMyForm() { MyForm myForm = new MyForm(); myForm.ShowDialog(); } 

对此:

 public void ShowMyForm() { using (MyForm myForm = new MyForm()) { myForm.ShowDialog(); } } 

在我们的测试中,第一个示例永远不会调用MyForm的Dispose()方法,但第二个示例会立即调用它。

当我们花时间追踪每个特定的资源问题时,这似乎是一种合理的方法作为短期解决方法吗?

我们是否可以考虑采用其他方法来确定和解决这些类型的资源问题的短期解决方法和/或方法?

根据MSDN ,您必须在使用ShowDialog显示的表单上显式调用Dispose(与Show方法不同):

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带有X的按钮)会导致隐藏窗体并将DialogResult属性设置为DialogResult.Cancel。 与非模态窗体不同,当用户单击对话框的关闭窗体按钮或设置DialogResult属性的值时,.NET Framework不会调用Close方法。 相反,表单被隐藏,可以再次显示,而无需创建对话框的新实例。 因为显示为对话框的窗体是隐藏而不是关闭的,所以当应用程序不再需要该窗体时,必须调用窗体的Dispose方法。

对于modal dialog,您应该使用以下模式:

 using ( var dlg = new MyDialog() ) { // other code here to initialize, etc. dlg.ShowDialog(); } 

由于MyDialog派生自Form ,而Form实现了IDisposable ,因此该模式将正确清理对话框。

这不应该是一个“短期解决方法”,而是您应该调用所有modal dialog的标准方法。

无模式对话是另一个故事。 您需要自己跟踪它们,并在应用程序的适当位置调用Dispose

通常,对于实现IDisposable的对象,使用using语句是一种好方法。

一个小样本情况:

假设你有第三方“组件”。 你不知道内部发生了什么,也许这个对象创建一个临时文件并删除Dispose上的文件。 如果您不调用Dispose()并且不使用该文件将永远不会被删除。

在您的情况下,只要打开表单modal您也可以这样做。