Предотвращение утечек памяти в WPF
Работая с WinForms
, вам нужно освободить память после использования объектов gdi, обработчиков событий, объектов из собственного кода и т.д.
В WinForms
я использовал для удаления, например, обработчиков событий в методе dispose.
Какое наилучшее решение для предотвращения утечек памяти в Wpf
? Это то же самое, что и в WinForms
с помощью Dispose pattern
? Вообще-то, мне нужно заботиться о обработчиках событий, gdi-объектах в Wpf
? Как насчет ресурсов, созданных во время выполнения (Brushes
и т.д.)?
Ответы
Ответ 1
Этот блог содержит самые распространенные ситуации, которые вызывают утечку памяти в приложениях WPF.
- Обработчики событий для объектов в родительских окнах
- Регистрация событий из статических объектов
- Использование таймеров
- Связывание данных
- Изменение свойства Text текстового поля
В нем также описывается, как исправить эти общие проблемы.
Еще один хороший подход - разработать приложение, следуя стандартным рекомендациям, а затем использовать какой-то профилировщик для определения утечек памяти или узких мест производительности.
Ответ 2
От MSDN: Любой элемент уровня инфраструктуры WPF (те объекты, которые происходят из FrameworkElement или FrameworkContentElement) имеют три общих события жизни: Инициализировано, Loaded и Unloaded.
.....
Разгружается, и он инициируется либо источником презентации, либо визуальным родителем, который удаляется. Когда выгружается и обрабатывается Unloaded, элемент, который является родителем источника события (как определено свойством Parent) или любым заданным элементом вверх в логических или визуальных деревьях, может быть уже не установлен, что означает, что привязка данных, ссылки на ресурсы и стили могут не устанавливаются в их нормальное или последнее известное значение времени выполнения.
Ответ 3
Некоторые полезные ссылки на утечки словаря ресурсов WPF:
Ответ 4
Следите за событиями: очень легко пропустить что-то, потому что все ссылки от делегата будут существовать до тех пор, пока не останется делегат. Я предлагаю использовать слабую схему событий, когда это возможно. Фактически Microsoft использует его в своей структуре Prism.
http://msdn.microsoft.com/en-us/library/aa970850.aspx
Также проверьте проблему, которую я много раз ловил при изучении WPF http://support.microsoft.com/kb/938416/en-us