我们有一个包含数千个窗体的Windows Forms应用程序。
其中许多是通过ShowDialog()方法临时显示为对话框。
这个应用程序已经存在多年了,我们发现由于窗体或其使用的控件中的各种资源泄漏,许多窗体不能及时进行垃圾回收。
具体来说,我们发现GDI+资源的一些例子没有被正确地处理,尽管可能存在其他类型的尚未被表征的资源泄漏。
虽然解决这个问题的正确方法显然是遍历每个窗体和每个控件,并消除所有的资源问题。这需要一些时间来完成。
作为一个短期替代方案,我们发现显式调用Dispose()函数可以启动垃圾回收过程,窗体及其资源会立即被释放。
我的问题是,在每个窗体的ShowDialog()块中加入using语句并在窗体显示后调用Dispose()是否是一个合理的解决方法?这是否也是一个普遍适用的好做法?
例如,将现有代码更改为:
变为这样:
在我们的测试中,第一个例子中MyForm的Dispose()方法从未被调用,而在第二个例子中立即被调用。
在我们花时间追踪每个特定资源问题的同时,这是否是一种合理的短期解决方法?
我们是否可以考虑其他短期解决方法和/或确定和解决此类资源问题的方法?
其中许多是通过ShowDialog()方法临时显示为对话框。
这个应用程序已经存在多年了,我们发现由于窗体或其使用的控件中的各种资源泄漏,许多窗体不能及时进行垃圾回收。
具体来说,我们发现GDI+资源的一些例子没有被正确地处理,尽管可能存在其他类型的尚未被表征的资源泄漏。
虽然解决这个问题的正确方法显然是遍历每个窗体和每个控件,并消除所有的资源问题。这需要一些时间来完成。
作为一个短期替代方案,我们发现显式调用Dispose()函数可以启动垃圾回收过程,窗体及其资源会立即被释放。
我的问题是,在每个窗体的ShowDialog()块中加入using语句并在窗体显示后调用Dispose()是否是一个合理的解决方法?这是否也是一个普遍适用的好做法?
例如,将现有代码更改为:
public void ShowMyForm()
{
MyForm myForm = new MyForm();
myForm.ShowDialog();
}
变为这样:
至此:
public void ShowMyForm()
{
using (MyForm myForm = new MyForm())
{
myForm.ShowDialog();
}
}
在我们的测试中,第一个例子中MyForm的Dispose()方法从未被调用,而在第二个例子中立即被调用。
在我们花时间追踪每个特定资源问题的同时,这是否是一种合理的短期解决方法?
我们是否可以考虑其他短期解决方法和/或确定和解决此类资源问题的方法?
Controls.Clear();
可能会导致内存泄漏。请参见汉斯在此处的评论 http://stackoverflow.com/a/7706549/939213 。 - ispiro