Подтвердить что ты не робот

Предотвращение утечек памяти в WPF

Работая с WinForms, вам нужно освободить память после использования объектов gdi, обработчиков событий, объектов из собственного кода и т.д.

В WinForms я использовал для удаления, например, обработчиков событий в методе dispose.

Какое наилучшее решение для предотвращения утечек памяти в Wpf? Это то же самое, что и в WinForms с помощью Dispose pattern? Вообще-то, мне нужно заботиться о обработчиках событий, gdi-объектах в Wpf? Как насчет ресурсов, созданных во время выполнения (Brushes и т.д.)?

4b9b3361

Ответ 1

Этот блог содержит самые распространенные ситуации, которые вызывают утечку памяти в приложениях WPF.

  • Обработчики событий для объектов в родительских окнах
  • Регистрация событий из статических объектов
  • Использование таймеров
  • Связывание данных
  • Изменение свойства Text текстового поля

В нем также описывается, как исправить эти общие проблемы.

Еще один хороший подход - разработать приложение, следуя стандартным рекомендациям, а затем использовать какой-то профилировщик для определения утечек памяти или узких мест производительности.

Ответ 2

От MSDN: Любой элемент уровня инфраструктуры WPF (те объекты, которые происходят из FrameworkElement или FrameworkContentElement) имеют три общих события жизни: Инициализировано, Loaded и Unloaded.

.....

Разгружается, и он инициируется либо источником презентации, либо визуальным родителем, который удаляется. Когда выгружается и обрабатывается Unloaded, элемент, который является родителем источника события (как определено свойством Parent) или любым заданным элементом вверх в логических или визуальных деревьях, может быть уже не установлен, что означает, что привязка данных, ссылки на ресурсы и стили могут не устанавливаются в их нормальное или последнее известное значение времени выполнения.

Ответ 4

Следите за событиями: очень легко пропустить что-то, потому что все ссылки от делегата будут существовать до тех пор, пока не останется делегат. Я предлагаю использовать слабую схему событий, когда это возможно. Фактически Microsoft использует его в своей структуре Prism.

http://msdn.microsoft.com/en-us/library/aa970850.aspx

Также проверьте проблему, которую я много раз ловил при изучении WPF http://support.microsoft.com/kb/938416/en-us