Будьте Осторожны С Childwindow В Silverlight Sdk. Обнаружена Утечка Памяти

В процессе поиска своих утечек памяти в приложении, написанном на Silverlight (последняя запись в личном блоге), я нашел ее в классе РебенокОкно ошибка, приводящая к утечке памяти.

В WinDbg это выглядит так: Модальное окно ниже в моем примере является потомком ChildWindow 0:000:x86> !dumpheap -mt 05e4f830 Адрес Размер МТ 07068c28 05e4f830 236 070ba900 05e4f830 236 всего 0 объектов Статистика: Имя класса TotalSize MT Count 05e4f830 2 472 MLOY.MKNA.KarjaKompassi.ModalWindow Всего 2 объекта 0:000:x86> !gcroot 07068c28 Примечание.

Корни, обнаруженные в стопках, могут быть ложноположительными.

Запустите «!help gcroot» для больше информации.

Сканирование потока 5 OSTHread 1880 Сканирование потока 22 OSTHread 1034 Сканирование потока 23 OSTHread 1878 Сканирование потока 24 OSTHread 1f28 ДОМЕН (062239E0): РУЧКА (закреплено): 3cc12f8: Корень: 07de4260 (System.Object []) -> 06ed1460(MLOY.MKNA.KarjaKompassi.FeedingPlan. Оболочка )-> 06ed14dc(MS.Internal.CoreTypeEventHelper) -> 06ef0c54(System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],[MS.Internal.CoreTypeEventHelper+EventAndDelegate, System.Windows]])-> 070ee840(System.Collections.Generic.Dictionary`2+Entry[[System.Int32, mscorlib],[MS.Internal.CoreTypeEventHelper+EventAndDelegate, System.Windows]][])-> 070a68a8(MS.Internal.CoreTypeEventHelper+EventAndDelegate) -> 070a6870(Система.

Windows. Маршрутизированный обработчик событий )-> 07068c28(МЛОЙ.

МКНА.

КарьяКомпасси.

Модальное окно ) В коде это выглядит так (с помощью Reflector я посмотрел в System.Windows.Controls.dll класс ChildWindow): Private void ChildWindow_LostFocus (отправитель объекта, RoutedEventArgs e) { … Application.Current.RootVisual.GotFocus += новый RoutedEventHandler(this.RootVisual_GotFocus); … } публичная недействительность Закрыть() { … Application.Current.RootVisual.GotFocus -= новый RoutedEventHandler(this.RootVisual_GotFocus); … } частная пустота SubscribeToEvents() { base.LostFocus += новый RoutedEventHandler(this.ChildWindow_LostFocus); } Мы можем подписаться несколько раз (каждый раз, когда окно теряет фокус), но отписываемся только один раз, когда вызываем Close().

Решение: В методе ChildWindow_LostFocus Замените проблемную строку парой: Application.Current.RootVisual.GotFocus -= новый RoutedEventHandler(this.RootVisual_GotFocus); Application.Current.RootVisual.GotFocus += новый RoutedEventHandler(this.RootVisual_GotFocus); Теги: #sdk #windbg #silverlight #утечка памяти #Чулан

Вместе с данным постом часто просматривают: