Ошибка памяти при повторном использовании System.Windows.Controls.Image с несколькими изображениями - PullRequest
0 голосов
/ 08 мая 2019

У меня есть холст на окне, и на этом холсте у меня есть изображение. Это изображение System.Windows.Controls.Image, поэтому у него нет / не требуется метод Dispose.

Однако, когда я установил его Source на новый (я установил его с помощью MemoryStream и с BitmapSource, оба имеют одинаковый эффект), его предыдущий Source не был полностью очищен. Использование памяти увеличивается, даже когда я заставляю его использовать то же изображение снова.

После загрузки достаточного количества изображений произойдет сбой с исключением из-за нехватки памяти около 3 ГБ. К сожалению, это довольно большие изображения, поэтому для этого требуется всего 17.

Используя Dot Memory, я вижу, что «утечка» находится в неуправляемой памяти, что может означать, что я пропускаю вызов Dispose (), или ImageSource все еще используется в программе, но я сомневаюсь в этом это локальная переменная, и она нигде не передается по ссылке.

Я пытался заставить сборщики мусора и заморозить BitmapSource, но оба не дали эффекта.

Есть ли способ заставить его полностью очистить предыдущее изображение перед загрузкой в ​​следующем? Я что-то пропустил? Я неправильно понимаю ситуацию?

Вот изображение, показывающее график использования памяти, оно показывает, что изображение частично очищается при отображении нового. Сборки мусора - неисполненные коллекции 1-го поколения, меня беспокоит, что их так много. memory usage graph

1 Ответ

0 голосов
/ 09 мая 2019

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

Редактировать: Оказалось, что это не было, это был сборщик мусора, который был слишком медленным. На самом деле я решил эту проблему, вызвав метод, который обнулял источники изображений, затем вызвал сборщик мусора, затем я сделал MessageBox.Show (), чтобы дать GC достаточно времени для очистки перед отображением следующего изображения.

Надеюсь, есть лучший способ сделать это.

Edit2: я нашел лучший способ сделать это. Причина, по которой окно сообщения работало, заключалось в том, что оно каким-то образом обновляло пользовательский интерфейс, в результате чего холст очищался. Тот же результат может быть достигнут путем вызова Canvas.UpdateLayout ()

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