Утечка памяти и проблема с производительностью в TreeFe WPF - PullRequest
2 голосов
/ 29 декабря 2011

У меня проблема с элементом управления WPF TreeView. Я думаю, что столкнулся с проблемой утечки памяти с этим элементом управления, а также с некоторыми проблемами производительности. Я подготовил простое демонстрационное решение, где вы можете увидеть эти проблемы. Ссылка для скачивания: http://www.custom -projects.com / TreeViewMemoryAndPerformanceIssue.zip

Я создаю дерево на основе некоторых доменных объектов. Объекты обернуты в моделях представления. Количество уровней не ограничено, но в настоящее время у нас есть максимум 3 уровня.

Итак, каждая модель представления может иметь детей.

Если вы нажмете на кнопки вверх / вниз элемента управления UpDown и не отпустите кнопку мыши, вы увидите, что скорость обновления значения int будет становиться все медленнее и медленнее, а потребление памяти постоянно возрастает.

Что я делаю: когда вы нажимаете на кнопку вверх / вниз, значение отправляется в модель представления через привязку данных. В сеттере я поднимаю событие. Наше приложение состоит из разных моделей представлений, и если кто-то изменяет данные в одной из них, другие уведомляются об этих событиях DataChanged.

Для простоты мои демонстрационные решения состоят только из NavigationViewModel. Так слушает для события DataChanged и, если оно запущено, дерево отображается.

Поскольку у нас нет списка, который всегда будет одинаковым (и только строки добавляются или удаляются), я не использую ObservableCollection. Мы всегда должны регенерировать список на основе объектов, которые пользователь добавил / создал.

В любом случае, я добавляю эти модели представлений в список и вызываю событие NotifyPropertyChanged. так что WPF обновляет дерево. Работает хорошо, но чем больше обновляется список, тем медленнее становится приложение (и увеличивается объем памяти).

Я проверил, что модели представления элементов собраны мусором, и я не вижу что-то не так на моей стороне. Я также провел профилирование производительности. Похоже, что проблема на стороне WPF, потому что мой код не замедляется. Метод Application.Run Время исполнения увеличивается ... Странная вещь.

Есть ли у кого-нибудь идея, почему память растет и никогда не освобождается и почему производительность начинает снижаться, как часто обновляется TreeView?

Буду признателен за любую помощь или комментарий по этому вопросу.

Спасибо, Christian

Ответы [ 2 ]

1 голос
/ 04 мая 2012

Я профилировал ваше тестовое приложение, используя ANTS Memory Profiler, и вы можете видеть, что ваши классы 'NavigationItemBaseViewModel' и массив "NavigationItemBaseViewModel []" по-прежнему хранятся в памяти по ссылкам, и с каждым шагом все хуже

Если вы медленно увеличиваете и позволяете обновлению произойти, то ссылки нарушаются и объекты удаляются.Все хорошо.Однако, если вы увеличиваете быстро / непрерывно, вы видите, что ваши ссылки не повреждены, поэтому массивы сохраняются в памяти.

Приращения становятся медленнее каждый раз, потому что вашему приложению приходится обновлять многие из этих представлений.В моделях с шагом № 58 между ними было 172 массива 517 NavigationItemBaseViewModel's.Где с «нормальной» функциональностью у вас есть только 4 массива и 13 NavigationItemBaseViewModel.

Надеюсь, это поможет, я бы порекомендовал вам профилировать вашу память, если вы не можете понять свою логику, когда новые создают новые массивы.Обычно лучше повторно использовать массивы.

Профилировщик, который я использовал, находится здесь: http://www.red -gate.com / products / dotnet-development / ants-memory-profiler / index2

Надеюсь, это поможет.

0 голосов
/ 02 мая 2012

Я исследовал множество утечек памяти в WPF и нашел этот инструмент очень полезным: http://www.jetbrains.com/profiler/ Он имеет пробный период 10 дней (я только что проверил), поэтому я надеюсь, что вы сможете найти свойпроблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...