DataGridViewRow不是垃圾收集

时间:2009-10-07 18:23:53

标签: .net winforms memory-management datagridview finalizer

我有一个DataGridView通过数据绑定对象定期填充,并且行数可能会变大,比如在“记录周期”期间会有数千个。

当一个新的“记录周期”开始时,网格被清除,因为基础数据源被清除并且过程再次开始。

这一切都很好,但是因为之前的运行需要一些时间,所有这些前面的行都变成了第2代对象,并且只在完整的GC上收集了垃圾。

然而,需要两个完整的GC来清除它们,因为第一个将它们全部发送到终结器队列。这意味着它们会占用内存的两倍。

使用反射器,我看到DataGridViewRow没有终结器方法,但是它确实从DataGridViewBand对象继承 - 它通过它的公共Dispose()方法调用GC.SuppressFinalize(this)。

所以我的问题是 - 为什么我的DataGridViewRows没有在第一个完整的GC上收集并进入终结器队列等待另一个?

(我的假设是没有终结器的任何对象都不应该被放到终结器队列中,并且任何有一个但是调用GC.SuppressFinalize的对象也不会放在队列上。我在这个假设中是对的?)

感谢。

2 个答案:

答案 0 :(得分:3)

GC.SuppressFinalize(this)的调用实质上告诉GC,在完成期间发生的清除行为已经发生(通过调用Dispose())并且它不需要再次执行终结。这与对象是否放在终结队列上无关。

任何时候实例化一个可终结对象(new ed),它都会被放置在终结队列中。终结队列仅在每个完整GC集合(Gen2集合)期间处理。可终结对象的一个​​问题是它们在实际收集之前至少至少一个GC循环。

答案 1 :(得分:0)

如果您没有丢弃对象,则它们不会被终止。