Предотвратить утечки памяти в WPF - PullRequest
14 голосов
/ 12 октября 2011

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

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

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

Ответы [ 4 ]

9 голосов
/ 12 октября 2011

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

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

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

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

4 голосов
/ 12 октября 2011

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

.....

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

2 голосов
/ 12 октября 2011
1 голос
/ 12 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...