Сборка мусора запускается во время отладки?
2731 просмотра
2 ответа
У меня есть программа, которая открывает COM-объект Excel, делает некоторые вещи и закрывает его. Затем я хочу переместить этот файл после его закрытия. Это работает нормально, если я запускаю программу без точек останова. Но если я вхожу во что-то в режиме отладки, прежде чем пытаться переместить файл, я получаю IOException: «Процесс не может получить доступ к файлу, потому что он используется другим процессом».
Так в чем же дело? Работает ли сборщик мусора лучше, когда программе разрешено работать на полной скорости, а не пока я прохожу через нее? Делает ли мой код больше, чем просто очень медленно запускает его? Есть ли другие последствия для режима отладки? Другие ошибки, которые встречаются просто потому, что я нахожусь в отладке и не запускаю exe?
Автор: Brad Источник Размещён: 12.11.2019 09:26Ответы (2)
18 плюса
Сборка мусора оптимизируется по-разному при запуске не в отладчике, да. В частности, CLR может обнаружить, что переменная не будет использоваться для остальной части метода, и обрабатывать ее как корень GC больше. В отладчике переменные в области видимости действуют как корни GC во всем методе, так что вы все еще можете исследовать значения с помощью отладчика.
Однако это редко должно быть проблемой - это должно влиять на вещи, только если финализатор действительно выполняет некоторую очистку, и если вы явно приводите вещи в порядок своевременно (например, с помощью using
операторов), вы обычно не заметите разницу ,
1 плюс
Для справки, я столкнулся с этим также несколько раз. Я обнаружил, что это работает при тестировании финализаторов, вызывающих собственный код стороны в режиме отладки:
((Action)()=>{
// Do your stuff in here ...
})();
GC.Collect();
GC.WaitForPendingFinalizers();
Сборщик мусора, похоже, хранит копию выделений, укорененных в локальной области метода, поэтому, создав новую область метода и выйдя, GC обычно освобождает ресурс. Пока это хорошо работает для моих целей отладки.
Автор: James Wilkins Размещён: 14.03.2019 10:35Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- c# Setting Objects to Null/Nothing after use in .NET
- c# Конвертировать целые числа в записанные числа
- c# Почему я не могу иметь абстрактные статические методы в C #?
- c# Как я могу оценить код C # динамически?
- garbage-collection Что такого плохого в использовании GC.Collect ()?
- garbage-collection Есть ли деструктор для Java?
- garbage-collection Лучшая практика для принудительного сбора мусора в C #
- garbage-collection Влияет ли назначение объектов на null в Java на сборку мусора?
- garbage-collection Когда можно позвонить в GC.Collect?
- garbage-collection Нужно ли явно удалять обработчики событий в C #
- garbage-collection Правильное использование интерфейса IDisposable
- garbage-collection Знаете какие-либо инструменты анализа журналов сборки мусора Java?
- garbage-collection Для чего нужен IDisposable?
- garbage-collection Утечка памяти в C #