Обнаружение утечек windowhandle в приложении на c #

StackOverflow https://stackoverflow.com/questions/1901091

  •  19-09-2019
  •  | 
  •  

Вопрос

Вчера я столкнулся с этим исключением:

Win32Exception: Fehler beim Erstellen des Fensterhandles

мог бы перевести:

Win32Exception: Error while creating the windowhandle

Я знаю, как это решить (даже написал короткое запись в блоге по теме - на немецком языке)

Но я не знаю, где мое приложение может "пропускать" не удаленные элементы управления, у которых все еще есть дескрипторы окон.

Есть ли какой-либо способ обнаружить / найти экземпляры, которые

  • реализовать IDisposable
  • иметь Parent == null

Объекты, соответствующие этим ограничениям, кажутся хорошими кандидатами.

Это было полезно?

Решение

Любой приличный профилировщик памяти покажет вам управляющие экземпляры.Они не будут убираться мусором, их свойство Handle сохраняет им жизнь.Их будет около 10 000 человек.Вы также можете просмотреть это с помощью диспетчера задач, используя View + Select Columns и отметив галочкой ПОЛЬЗОВАТЕЛЬСКИЕ объекты.Наблюдение за увеличением количества по мере тестирования приложения должно послужить неплохой подсказкой.

Проверка кода тоже должна пройти долгий путь, существует не так уж много возможных способов утечки окна.Сначала обратите внимание на наиболее распространенный случай, код, который вызывает элементы управления.Очистить() или элементы управления.Удалить /At(), но также не удаляет элемент управления.Следующий распространенный случай - это класс SystemEvents, вы должны явно отказаться от подписки на его события.Остальные найти не так-то просто, вам понадобится этот профилировщик.

Поиск дескрипторов самостоятельно во время выполнения технически возможен с помощью Reflection.Дескрипторы хранятся в системе.Внутренние.HandleCollector.handleTypes[].Ну, технически.

Другие советы

Каждый объект, который реализует IDisposable имеет Dispose способ.Этот метод следует вызывать, когда объект больше не нужен.Используется ли он только в одном методе, окружите его using заявление (звонки Dispose автоматически).Если это переменная-член вашего класса, ваш класс должен реализовать IDisposable сама по себе. FxCop ( Форекс Коп ) для этого есть правило проверки.

Если они не собраны из-за того, что какой-то другой объект ссылается на ваши элементы управления, то ни вызова dispose, ни установки parent в null недостаточно.Возможно, вы привязываетесь к событиям, а не отделяетесь от них.

Особенно проверьте случай присоединения к событиям из элементов управления, не содержащихся в attacher, в этом случае вы всегда должны отсоединяться от событий при удалении элементов управления, в противном случае attacher по-прежнему будет ссылаться на элемент управления и, следовательно, он не будет выпущен

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top