Сборка мусора запускается во время отладки? - PullRequest
7 голосов
/ 23 августа 2011

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

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

Ответы [ 2 ]

17 голосов
/ 23 августа 2011

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

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

0 голосов
/ 15 марта 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...