Я знаю, что очень похожие вопросы задавались здесь в прошлом, но ни у одного не было решения моей проблемы:
Я загружаю изображение из памяти в BitmapImage:
private static BitmapImage LoadImage(byte[] imageData)
{
if (imageData == null || imageData.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
И затем используйте это (с INotifyPropertyChange), чтобы связать результирующий BitmapImage с источником объекта изображения (на странице).
Проблема в том, что это приведет к утечке памяти (в моем случае - до 300 МБ на 2-3 изображениях!)
Вы даже не можете найти это с помощью Профилировщиков - только .net Memory Profiler помог мне справиться (так как он находится в неуправляемой памяти, куда направляются все байты - поэтому ANTS говорит мне: «.NET использует 19,24 МБ из 367, 3MB всего приватных байтов, выделенных для приложения "- приятно):
Неважно, что я пытаюсь - я не могу избавиться от этой утечки.
Пробовал (один и все сразу):
- очистить дерево визуалов / удалить изображение при выгрузке
- Установите для Image-Source значение null
- использовать ImageBrush в Rectangle вместо Image
- другие CacheOptions без утилизации MemoryStream
- не замораживайте изображение
Я не понимаю - правда!
Как только я перестаю использовать изображение в источнике, все в порядке (без утечек).
Кто-нибудь, какие варианты я могу попробовать?
Замечание
Похоже, что это совсем не ошибка (см. Мой второй комментарий) - я должен проверить это, поэтому я пока оставлю вопрос открытым - возможно, это может помочь и с другими вопросами по этому вопросу