Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / управляемые ресурсы формы / 3 сообщений из 3, страница 1 из 1
20.01.2016, 13:32
    #39151388
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
управляемые ресурсы формы
ссылка на проект:

суть:
есть окно, на нём 4 кнопки
кнопка #1 создает модель ListModel и окно ChildrenWindow1, задает контекст данных для неё и открывеат. В ListModel есть список List<Entity> который в конструкторе модели сразу генерируется, а в окне ListBox который вяжется к этому свойству.

кнопка #2 создает модель ListViewModel с формочкой ChildrenWindow2, всё делается точно так же, как и в п.1, но с тем лишь отличием что свойство EntityList у первой модели List<Entity>, а у второй ListCollectionView.

Теперь пробуем нажимать кнопочки:
1) Как только мы нажимаем кнопку №1 создается модель ListModel и в конструкторе создается список из 1000000 объектов, на что уходит примерно 100 мб памяти. У меня после запуска было потрачено 1,5 мб памяти, после нажатия кнопки 1 ~101 мб
Всё круто, теперь закрываем формочки, ииии.. И ничего не происходит, память не высвобождается, хотя ссылок на модель уже не существует. (в теории) Жмём 4 кнопку которая выполняет GC.Collect и опять ничего.

2) Закрываем программу и запускаем по новой, теперь нажимаем кнопку 2, память расходуется в том же объёме (~100 Mb), закрываем форму ииии... память высвобождается (напомню, что отличаются модели только тем, что у них разные свойства EntityList). Если высвобождение не произошло, то можно помочь 4 кнопкой. И всё отлично работает.

3) Перезапускаем прогу и нажимаем 1 кнопку, затем закрываем форму и снова нажимаем кнопку 1, повторяем 10 раз и убеждаемся, что 2,3,4 и т.д. формы при закрытии высвобождают память предыдущей формы, при этом новые 100 мб остаются там же, где и были после закрытия. Проще говоря, сколько бы раз я не открывал и не закрывал форму, будет всё равно израсходаванно 100 мб на последнее открытое окно и ни какие GC.Collect её не освобождают, так как закрытая форма где то на них ссылается.

4) Нажимаем кнопку #1 4 раза подряд (не закрывая окошек). Израсходаванно ~400 мб, закрываем все 4е сразу и опять занято ~100 мб. Проверяем тоже самое с кнопкой #2 и убеждаемся, что всё высвобождается без остатка.

5) Нажимаем кнопку #1 любое количество раз, закрываем все окна, следовательно занято 100 Mb памяти, теперь нажимаем кнопку #2, отрывается окно с модель ListViewModel и видим, что память от 1 окна сразу высвободилась, закрываем окно и видим, что занято ~1,5 мб. То, есть практически вся память высвободилась.

Как объяснить такое? почему List<T> и ListCollectionView ведут себя в данном случаи совершенно разным образом?

у меня есть 1 предположение, в ItemsControl когда свойство ItemSource изменилось проверяет новое значение на тип
ICollectionView, если получен объект заданного типа, то ItemsControl использует его как есть, если тип другой, то ItemsControl получает его ListCollectionView (по умолчанию).

Когда я закрываю форму, то в варианте с #1 кнопкой, ссылка на CollectionView по умолчанию где то зависает и список не высвобождается.

Надеюсь на мнение местных экспертов .NET ^)
...
Рейтинг: 0 / 0
20.01.2016, 13:32
    #39151391
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
управляемые ресурсы формы
...
Рейтинг: 0 / 0
28.01.2016, 12:56
    #39157367
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
управляемые ресурсы формы
CollectionView (вообще, всё что реализует ICollectionView) создаются через singleton factory-класс, который на один экземпляр списка создаёт один экземпляр view. Оптимизация т. с., в .Net вообще много такой оптимизации. Если ж запустить, скажем, в разных доменах, то и factory-классы будут иметь разные экземпляры.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / управляемые ресурсы формы / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]