Выполняется ли сбор мусора во время отладки?

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

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

Ответ 1

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

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

Ответ 2

Как вы обрабатываете удаление объекта Excel?

Если вы видите ошибку после остановки VS Debugger, и вы позволили своему коду запустить удаление COM-объекта, тогда у вас может быть действительная точка.