#silverlight #memory-leaks
#silverlight #утечки памяти
Вопрос:
Мой элемент управления поддерживается активным из-за команды, к которой он привязан. Как я могу разорвать эту ссылку? Это вызывает серьезную утечку памяти в моем приложении. Элемент управления находится внутри DataTemplate, поэтому у меня нет прямого доступа к нему.
Вот мой профиль памяти ANTS:
Как, черт возьми, мне разорвать это соединение?
Комментарии:
1. Проверьте эту ссылку: forums.silverlight.net/forums/p/177550/418045.aspx
2. Отлично, но что, черт возьми, такое
WeakEventListenerBase
. Это нигде не реализовано и не документировано. google.com /…3. Если вы перейдете по ссылке в одном из сообщений, вы попадете сюда: blog.thekieners.com/2010/02/17/weakeventsource-implementation-2
4. Я это видел. Очевидно, я все еще чего-то не понимаю. Об этом мало что говорится
WeakEventListenerBase
. Только для того, чтобы сказать, что он «является новым из-за рефакторинга, который был необходим для получения нестандартного объявления для возвращаемого значения метода CreateWeakEventListener». Что такоеWeakEventListener
? Я новичок в слабых ссылках.5. Вы правы, я неправильно прочитал заголовок исходного файла. Не уверен, откуда он взял WeakEventListenerBase, но у него есть другая ссылка на то, что кажется полным исходным кодом для аналогичной реализации: blog.thekieners.com/2010/02/11 /…
Ответ №1:
Хотя я включил WeakEventListener
, я обнаружил, что моя проблема заключалась в элементе управления, который я использовал для упаковки своих изображений. Я подключал его к событиям DownloadProgress
, ImageOpened
и ImageFailed
и никогда не отключал их. Я думал, что ничто другое в моем коде не касалось BitmapImage
объектов, поэтому они были бы мусором, собранным вместе с элементом управления. Он видит, что это не так. На BitmapImage
объекты ссылался статический элемент (и, следовательно, корень GC) глубоко в коде Microsoft под названием «ManagedPeerTable.PeggedManagedPeersWithRefs». Он был настолько глубоким, что поиск Google вернул для него только пять результатов. Теперь, я полагаю, их будет шесть.