代码之家  ›  专栏  ›  技术社区  ›  Andy

未垃圾收集DataGridViewRow

  •  1
  • Andy  · 技术社区  · 15 年前

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

    当新的“日志记录周期”开始时,网格将被清除,因为基础数据源被清除,进程将再次开始。

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

    但是,需要两个完整的GC来清除它们,因为第一个GC将它们全部发送到终结器队列。这意味着他们的记忆时间是他们的两倍。

    使用Reflector,我看到DataGridViewRow没有终结器方法,但它确实继承了DataGridViewBand对象,它继承了该对象,并且通过它的public Dispose()方法调用gc.SuppressFinalize(this)。

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

    (这里我的假设是,没有终结器的任何对象都不应放置在终结器队列中,并且没有终结器队列但调用gc.SuppressFinalize的任何对象也不会放置在队列中。我的假设正确吗?)

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Scott Dorman    15 年前

    呼叫 GC.SuppressFinalize(this) 本质上告诉GC,终结过程中发生的清理行为已经发生(通过调用 Dispose() )它不需要再次执行定稿。这与对象是否放置在终结队列上没有关系。

    任何时候实例化可终结对象( new (ed),它被放置在终结队列中。仅在每个完整GC收集(gen2收集)期间处理终结队列。可终结对象的一个问题是它们将继续存在 至少 在实际收集它们之前,再执行一个GC循环。

        2
  •  0
  •   Drew Noakes    15 年前

    如果你不处理你的物品,那么它们就不会被禁止定稿。