|
управляемые ресурсы формы
|
|||
---|---|---|---|
#18+
ссылка на проект: суть: есть окно, на нём 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 ^) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 13:32 |
|
управляемые ресурсы формы
|
|||
---|---|---|---|
#18+
CollectionView (вообще, всё что реализует ICollectionView) создаются через singleton factory-класс, который на один экземпляр списка создаёт один экземпляр view. Оптимизация т. с., в .Net вообще много такой оптимизации. Если ж запустить, скажем, в разных доменах, то и factory-классы будут иметь разные экземпляры. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 12:56 |
|
|
start [/forum/topic.php?fid=21&msg=39151391&tid=1440739]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
131ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 224ms |
0 / 0 |