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

Ava*_*his 8 c# garbage-collection using-statement resource-leak winforms

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

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

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

具体来说,我们已经找到了未正确处理的GDI +资源的示例,尽管可能还有其他类型的资源泄漏尚未被描述.

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

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

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

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

public void ShowMyForm()
{
    MyForm myForm = new MyForm();
    myForm.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

对此:

public void ShowMyForm()
{
    using (MyForm myForm = new MyForm())
    {
        myForm.ShowDialog();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pat*_*ick 12

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

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