Сборка мусора запускается во время отладки?

c# garbage-collection

2731 просмотра

2 ответа

У меня есть программа, которая открывает COM-объект Excel, делает некоторые вещи и закрывает его. Затем я хочу переместить этот файл после его закрытия. Это работает нормально, если я запускаю программу без точек останова. Но если я вхожу во что-то в режиме отладки, прежде чем пытаться переместить файл, я получаю IOException: «Процесс не может получить доступ к файлу, потому что он используется другим процессом».

Так в чем же дело? Работает ли сборщик мусора лучше, когда программе разрешено работать на полной скорости, а не пока я прохожу через нее? Делает ли мой код больше, чем просто очень медленно запускает его? Есть ли другие последствия для режима отладки? Другие ошибки, которые встречаются просто потому, что я нахожусь в отладке и не запускаю exe?

Автор: Brad Источник Размещён: 12.11.2019 09:26

Ответы (2)


18 плюса

Решение

Сборка мусора оптимизируется по-разному при запуске не в отладчике, да. В частности, CLR может обнаружить, что переменная не будет использоваться для остальной части метода, и обрабатывать ее как корень GC больше. В отладчике переменные в области видимости действуют как корни GC во всем методе, так что вы все еще можете исследовать значения с помощью отладчика.

Однако это редко должно быть проблемой - это должно влиять на вещи, только если финализатор действительно выполняет некоторую очистку, и если вы явно приводите вещи в порядок своевременно (например, с помощью usingоператоров), вы обычно не заметите разницу ,

Автор: Jon Skeet Размещён: 23.08.2011 05:53

1 плюс

Для справки, я столкнулся с этим также несколько раз. Я обнаружил, что это работает при тестировании финализаторов, вызывающих собственный код стороны в режиме отладки:

((Action)()=>{
   // Do your stuff in here ...
})();

GC.Collect();
GC.WaitForPendingFinalizers();

Сборщик мусора, похоже, хранит копию выделений, укорененных в локальной области метода, поэтому, создав новую область метода и выйдя, GC обычно освобождает ресурс. Пока это хорошо работает для моих целей отладки.

Автор: James Wilkins Размещён: 14.03.2019 10:35
Вопросы из категории :
32x32