Элемент управления Silverlight не собирает мусор из-за команды

#silverlight #memory-leaks

#silverlight #утечки памяти

Вопрос:

Мой элемент управления поддерживается активным из-за команды, к которой он привязан. Как я могу разорвать эту ссылку? Это вызывает серьезную утечку памяти в моем приложении. Элемент управления находится внутри DataTemplate, поэтому у меня нет прямого доступа к нему.

Вот мой профиль памяти ANTS:

Профиль памяти 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 вернул для него только пять результатов. Теперь, я полагаю, их будет шесть.