Утечки памяти в WPF / C # - PullRequest
6 голосов
/ 22 января 2009

Обратите внимание, что это делается в WPF/C#, а не в .net2.0 Winforms

У меня есть ListBox, который содержит объекты, скажем Class X. Класс X содержит объект BitmapSource, который отображается в списке, поэтому он выглядит как [Image] [Text]

Это загружается с помощью CreateBitmapSourceFromHBitmap - обратите внимание также, что я звоню DeleteHBitmap, чтобы удалить дескриптор HBitmap во время этого вызова, что, как известно, из сообщений, которые я видел в Google / и т.д.

У меня есть дерево, которое содержит ListBox в каждом TreeViewItem - обычно в дереве загружено несколько элементов. Пользователи могут перетаскивать эти изображения в различные элементы TreeViewItem. Для обработки этих операций я вручную вызываю операции:

<code>
    ItemCollection.RemoveAt
</code>

<code>
    ItemCollection.Insert
</code>

до move изображений из коллекции элементов ListBox, обратите внимание, когда я вставляю, я создаю новый объект Class X для вставки в коллекцию элементов ListBox

Я заметил, что я получаю постоянную утечку памяти при вызове таких операций несколько раз в течение 5-10 минут последовательного перетаскивания.

Мой вопрос:

Правильно ли я справляюсь с перемещением BitmapSource? Есть ли что-то, что я делаю, чтобы изображения не были полностью удалены из ItemCollection?

Или есть что-то фундаментальное, что я пропустил?

1 Ответ

1 голос
/ 28 января 2009

Какое определение переменной, которая содержит изображение в вашем ClassX ??? Проблема может заключаться в том, что вы создаете новый ClassX, а старый GC не удаляет старый, что заставляет головку иметь два разных экземпляра ClassX.

Поскольку вы используете неуправляемый код (CreateBitmapSourceFromHBitmap), вы должны проверить, правильно ли вызваны все методы finalize (хотя, вероятно, они закрыты или расположены) и нет ли статических ссылок, которые могут указывать на ваш ClassX.

Помните, что если ваш ClassX не удален, экземпляр Bitmap будет доступен на графике, созданном GC, и он не удалит его из кучи.

Я рекомендовал использовать perfmon и добавить объект памяти .Net, чтобы увидеть, есть ли какой-либо объект, который выжил, завершить или закрепить объект, это тот, который вас, вероятно, заинтересует в отношении утечки памяти.

Надеюсь, это поможет: P, но будет лучше, если вы добавите код ClassX.

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