Silverlight: Популярный вариант утечки памяти связанный с динамическиизменяемым деревом элементов приложения Silverlight.
Нужно помнить следующий вариант утечки памяти, т.к., как мне кажется, он один из самых частых.
Вы создали элемент. (Все, забудьте в WPF / Silverlight слово "контрол" ).
Вы добавляете этот элемент динамически в дерево элементов приложения Silverlight.
По действию пользователя вы заменяете этот элемент его новым инстансом (экземпляром).
Все красиво работает, все заменяется и потом удаляется сборщиком мусора, но до тех пор, пока вы не привяжете методы экземпляра вашего элемента, как обработчики событий элементов, постоянно находящихся в иерерхии элементов вашего Silverlight приложения.
Например, очень часто нужно реагировать на события Application.Current.RootVisual.
! Будте внимательны. Как только вы начинаете использовать элемент, как динамически добавляемый / заменяемый / удаляемый, то вы больше не может (не имеете права) привязывать методы его экземпляра к событиям элементов постоянно находящихся в иерархии приложения Silverlight, т.к. в этом случае удаленные / замененные экземпляры вашего элемента не будут уничтожатся сборщиком мусора благодаря механизму событий в .NET Framework.
Вариантов обхода этого ограничения много (Prism: Event Aggregator), поэтому используйте нужный вам по обстоятельствам.
Или используйте слабую ссылку - WeakReference
Чтобы копнуть глубже есть статья Слабые события в C#.
Комментарии
Отправить комментарий