正如我从网上和我的个人实验中了解到的,GC 永远不会调用表单的终结器(System.Windows.Forms.Form)。据说在 Form GC.SuppressFinalize() 的 Dispose() 内部被调用,这样终结器就不会被再次调用。
示例:
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() 时内存使用量是否减少。
我的方法不聪明,我想知道是否有其他更聪明的方法或一些工具来确认表单实际上是垃圾收集?谢谢。