【发布时间】:2013-07-12 07:21:29
【问题描述】:
从网上和我的个人实验中了解到,GC 永远不会调用表单的终结器 (System.Windows.Forms.Form)。 据说在 Form GC.SuppressFinalize() 的 Dispose() 里面调用了 finalizer 就不会再被调用了。
例子:
public partial class UpdateForm : Form
{
public UpdateForm()
{
InitializeComponent();
// Listen to the event of some model
Database.OnDataUpdated += new EventHandler(DataBase_OnDataUpdated);
}
~UpdateForm()
{
// Never gets called.
}
private void DataBase_OnDataUpdated(object sender, EventArgs e)
{
// Update data on this form
}
}
但是,如上例所示,如果表单连接 (+=) 某个模型的事件并且没有断开 (-=) Dispose() 中的事件,则表单永远不会被垃圾回收,即使Dispose() 被调用。
为了检查表单是否真的被垃圾回收,我在表单内创建了一个大数组以消耗大量内存,如下所示:
int[] dummyArray = new int[1024 * 1024 * 128]; // Comsume 128MB memory
然后我在Windows中查看任务管理器的内存配置文件,看看我在处理表单后调用GC.Collect()时是否减少了内存使用量。
我的方法不聪明,我想知道是否有其他更聪明的方法或一些工具来确认表单实际上是垃圾收集?谢谢。
【问题讨论】:
-
即使没有调用终结器,表单仍然会被垃圾收集。但是为什么要调用终结器呢?您可以在终结器中放入哪些不应该放入
Dispose方法的内容? -
抱歉造成混淆。我并不是说我想要调用终结器。我只是想确保表单被垃圾回收,即表单使用的所有内存都应该被释放。我通常使用终结器来检查一个对象是否真的被垃圾回收了,而这不能用表单来完成。
标签: c# winforms memory garbage-collection finalizer