DataGridViewRow не является сборщиком мусора - PullRequest
1 голос
/ 07 октября 2009

У меня есть DataGridView, регулярно заполняемый через объекты, связанные с данными, и число строк может потенциально стать большим, скажем, многие тысячи в течение «цикла регистрации».

Когда начинается новый «цикл регистрации», сетка очищается, поскольку очищается базовый источник данных, и процесс начинается снова.

Это все нормально, но поскольку предыдущий запуск занимает некоторое время, все эти предыдущие строки стали объектами поколения 2, и только мусор собирается на полном GC.

Однако для их очистки требуется ДВА полных ГХ, поскольку первый отправляет их всех в очередь финализатора. Это означает, что они держатся вдвое дольше, заполняя память.

Используя рефлектор, я вижу, что DataGridViewRow не имеет метода финализатора, но он наследуется от объекта DataGridViewBand, который - и вызывает GC.SuppressFinalize (this) через его публичный метод Dispose ().

Итак, мой вопрос - почему мои DataGridViewRows не собираются на первом полном GC и не попадают в очередь финализаторов в ожидании другого?

(Мои предположения здесь заключаются в том, что любой объект без финализатора не должен помещаться в очередь финализатора, и любой объект, который имеет его, но вызывает GC.SuppressFinalize, также не будет помещаться в очередь. Я прав в этом предположении ?)

Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 октября 2009

Вызов GC.SuppressFinalize(this), по существу, сообщает GC, что процедуры очистки, которые происходят во время финализации, уже произошли (через вызов Dispose()) и что ему не нужно снова выполнять финализацию. Это не имеет никакого отношения к тому, помещен ли объект в очередь завершения.

Каждый раз, когда создается экземпляр завершаемого объекта (new ed), он помещается в очередь завершения. Очередь финализации обрабатывается только во время каждой полной коллекции GC (коллекция Gen2). Одна из проблем с финализируемыми объектами состоит в том, что они выживут как минимум один дополнительный цикл GC до того, как они будут фактически собраны.

0 голосов
/ 07 октября 2009

Если вы не утилизируете свои объекты, финализация не будет подавлена.

...