【发布时间】:2009-10-07 18:23:52
【问题描述】:
我有一个通过数据绑定对象定期填充的 DataGridView,并且行数可能会变大,例如在“记录周期”期间有数千行。
当新的“记录周期”开始时,网格会被清除,因为底层数据源已被清除,并且该过程再次开始。
这一切都很好,但是因为之前的运行需要一些时间,所有之前的行都变成了第 2 代对象,并且只有在完整 GC 上进行垃圾收集。
但是,需要两次完整的 GC 才能清除它们,因为第一个将它们全部发送到终结器队列。这意味着它们占用内存的时间是原来的两倍。
使用反射器,我看到 DataGridViewRow 没有终结器方法,但它确实继承自 DataGridViewBand 对象,它确实 - 它通过它的公共 Dispose() 方法调用 GC.SuppressFinalize(this)。
所以我的问题是 - 为什么我的 DataGridViewRows 没有在第一次完整 GC 时被收集并进入终结器队列等待另一个?
(我在这里的假设是,任何没有终结器的对象都不应该被放入终结器队列中,并且任何有终结器但调用 GC.SuppressFinalize 的对象也不会被放置在队列中。我在这个假设上是对的吗?)
谢谢。
【问题讨论】:
标签: .net winforms memory-management datagridview finalizer