2012-06-25 2 views
0

Мы работаем над приложением Silverlight с использованием Silverlight 5 и MVVM Light. В представлении представлено более 3000 графических элементов, каждый из которых имеет связанную ViewModel. Элемент ItemsControl используется для привязки этих объектов к этим моделям просмотров. Когда представление загружается в первый раз, для отображения 3000 объектов требуется 7 секунд. Однако, когда мы обновляем представление, устанавливая новую коллекцию моделей представлений, для рендеринга требуется 17 секунд - даже если на этот раз мы отобразим меньшее количество ViewModels. Озабоченность здесь заключается в 10-секундной разнице между различными визуализацией.GC блокирует поток пользовательского интерфейса в приложении Silverlight

Мы обнаружили, что мы не смогли очистить ViewModels от GC (добавив их в другую коллекцию и никогда не выпуская их), последующие времена визуализации были всего лишь 7 секунд. Таким образом, вывод из этого состоит в том, что дополнительные 10 секунд вызваны сборкой мусора старых моделей ViewModels.

Из того, что мы видели выше, кажется, сбор мусора блокирует поток пользовательского интерфейса. Пользовательский интерфейс замораживается до тех пор, пока GC не завершит свою работу (мы видим это, как только завершится наше временное ведение журнала в режиме VM Finalizer), тогда пользовательский интерфейс возобновит рендеринг.

Таким образом, в целом, наши тайминги:

Начальные 3000 объектов - ~ 7 секунд. Затем замените на 500 объектов - ~ 17 секунд.

Начальные 500 объектов - ~ 2 секунды. Затем замените 3000 объектов - ~ 7 секунд.

Начальные 3000 объектов - ~ 7 секунд. Затем замените 3000 объектов - ~ 17 секунд.

Есть ли какие-либо предложения по этой очень странной проблеме, которую мы видим?

+1

Используйте профайлер, чтобы увидеть, что происходит за дополнительное время. –

+0

Да, я второй совет по использованию профилировщика, чтобы узнать, что именно происходит, и подтверждая, что GC является виновником первого. –

ответ

0

Возможно, вам понадобится в вашем случае вручную вызвать сборщик мусора. Это может не иметь никакого влияния, но я бы предложил изучить ваш код и проверить, можете ли вы поместить его где-нибудь умный в свой код, чтобы увидеть, оказывает ли оно какое-либо влияние на время загрузки.

Check this link for calling the GC manually.

+1

Если вы вручную вызываете GC, вы делаете что-то неправильно. – Will

Смежные вопросы