Я немного поигрался с Silverlight и пытаюсь перенести приложение Silverlight 3.0 на Silverlight 4.0.
Мое приложение загружает различные файлы XAP и по запросу пользователя создает экземпляр пользовательского элемента управления Xaml и добавляет его в основной контейнер, в своего рода MEF-подходе, чтобы я мог иметь расширяемое и подключаемое приложение.
Приложение довольно большое, и для обеспечения приемлемых характеристик и начальной загрузки я создал несколько вспомогательных классов для загрузки в фоновом режиме всех страниц и пользовательских элементов управления, которые могут быть использованы позже.
На Silverlight 3.0 все работало без проблем.
Переходя на SL 4.0, я заметил, что когда процесс подходит к созданию экземпляров пользовательских элементов управления, макет неожиданно замирает на минуту, а иногда и больше. Глядя на диспетчер задач, использование IE увеличивается с 50 МБ до 400 МБ, а иногда и до 1,5 ГБ.
Если процесс не займет так много времени, верстка будет отображена правильно, даже если использование памяти все еще очень велико. В противном случае происходит сбой из-за нехватки памяти.
При запуске того же приложения, скомпилированного в SL3, используемая память составляет около 200 МБ, когда загружены все пользовательские элементы управления. Время, затрачиваемое на загрузку приложения в SL3, составляет около 10 секунд, а в SL4 - до 3 минут. В макете нет прозрачных пленок, не заданы прозрачности, нет эффектов и анимации.
Пользовательские элементы управления создаются на лету и специально добавляются или удаляются в визуальном дереве, когда пользователь переключается с одного экрана на другой. Все ресурсы очищаются должным образом, когда пользовательское управление удаляется из визуального дерева, чтобы позволить ГХ работать в фоновом режиме.
Я могу сделать что-то не так, но я не мог понять, где именно выявить источник этой проблемы. Насколько я знаю, в SL4 нет профилировщика памяти, который бы помог мне найти, где искать. Но опять же я не мог быть в курсе новых доступных инструментов отладки.