Утечка памяти в WPF

У меня есть форма WPF, которую я сам не создал, поэтому я не очень хорош в WPF.Это плохо, хотя, до 400 МБ и закрытие формы не помогает.Проблема заключается в том, что мое приложение загружает все картинки одновременно.Я хотел бы загрузить только те, которые видны в данный момент.Это около 300 изображений, и они немного большие, поэтому моя WPF-форма страдает от загрузки их всех.У меня есть ---- +: = 0 =: + ---- с моим собственным типом, который имеет свойство ---- +: = 1 =: + ---- .Код в шаблоне выглядит так:И тогда у меня есть сетка с элементом управления, который имеет выше шаблон в качестве источника.Код для этого элемента управления приведен ниже.Пожалуйста, дайте мне подсказки о том, как оптимизировать код и, возможно, получить только те, которые видны и имеют столько загруженных элементов управления одновременно?
4 голоса | спросил Oskar Kjellin 19 Mayam10 2010, 00:37:25

3 ответа


0
Элемент управления ElementFlow такой же, как описано здесь ?Похоже, что элемент управления уже использует виртуализацию , поэтому я не ожидаю, что он получит доступ к свойству Thumbnail невидимого элемента.Как вы моделируете структуру данных, которая предоставляет свойство 'Thumbnail'?Можете ли вы настроить его так, чтобы свойство request загружало миниатюру при первом доступе?Возможно, реализация этого с помощью резервного кэша (который хранит миниатюры, загруженные в течение определенного периода времени) решит проблему.РЕДАКТИРОВАТЬЯ мог предположить что-то, чего не должен был иметь.Читая комментарии ко второму сообщению, которое я связал, я теперь думаю, что, возможно, общедоступная версия элемента управления ElementFlow фактически не реализует виртуализацию.Возможно, вы могли бы зарегистрировать доступ к свойству «Миниатюра» и определить, доступно ли свойство для невидимых элементов.
ответил Daniel Pratt 19 Mayam10 2010, 00:59:19
0
Первое, на что нужно обратить внимание, когда вы пытаетесь обнаружить утечки памяти в приложении .NET, WPF или нет, это объекты, которые подписываются на события.Если объект X прослушивает событие, вызванное объектом Y, тогда Y содержит ссылку на X. Какой бы метод виртуализации (или удаления) вы ни внедрили, если X не отписывается от события Y, X будет оставаться в графе объектов до тех пор, покакак Y, и никогда не будет завершен и сборщик мусора.(Даже если он реализует ---- +: = 0 =: + ---- и вы явно вызываете ---- +: = 1 =: + ---- для него.)Когда вы говорите «закрытие формы не помогает», это вызывает у меня двойное подозрение: я ожидаю, что кто-то реализовал свойство объекта в объекте ---- +: = 2 =: + ---- , и этот объектподписался на какое-то событие.Таким образом, вы закрываете окно, но оно все еще существует в графе объектов, потому что на одно из его свойств ссылаются.(Чтобы дать вам представление о том, насколько коварным это может быть: WinForms ---- +: = 3 =: + ---- элементы управления подписываются на события изменения темы Windows, когда они становятся видимыми. Это замечательно, если вы меняете свой компьютерТема автоматически отражается в пользовательском интерфейсе вашего работающего приложения, и она не так хороша, если вы разыменовываете ---- +: = 4 =: + ---- без предварительной установки ---- +: = 5 =: + ---- к false, он продолжит получать события смены темы, пока приложение не завершится.)Профилировщик памяти может помочь с этим - вот как я обнаружил, что мое приложение имеет тысячи ---- +: = 6 =: + ---- объектов в памяти, хотя я думал, что все они были уничтожены.
ответил Robert Rossney 19 Mayam10 2010, 04:48:36
0
Трудно сузить проблему, используя только ваш фрагмент кода.Возможно, вы захотите Visual Profiler, если вы еще этого не сделали.
ответил sarvesh 19 Mayam10 2010, 00:48:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132