утечки памяти в .net4 - привязка памяти BitmapImage к Image-Source - PullRequest
3 голосов
/ 07 февраля 2012

Я знаю, что очень похожие вопросы задавались здесь в прошлом, но ни у одного не было решения моей проблемы:

Я загружаю изображение из памяти в 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 всего приватных байтов, выделенных для приложения "- приятно): Memory-Profiler output

enter image description here

Неважно, что я пытаюсь - я не могу избавиться от этой утечки. Пробовал (один и все сразу):

  • очистить дерево визуалов / удалить изображение при выгрузке
  • Установите для Image-Source значение null
  • использовать ImageBrush в Rectangle вместо Image
  • другие CacheOptions без утилизации MemoryStream
  • не замораживайте изображение

Я не понимаю - правда! Как только я перестаю использовать изображение в источнике, все в порядке (без утечек).

Кто-нибудь, какие варианты я могу попробовать?

Замечание Похоже, что это совсем не ошибка (см. Мой второй комментарий) - я должен проверить это, поэтому я пока оставлю вопрос открытым - возможно, это может помочь и с другими вопросами по этому вопросу

1 Ответ

0 голосов
/ 08 февраля 2012

Извините, ребята - это действительно не было "БАГОМ", но вызвано фотографиями с высоким разрешением.

Пожалуйста, прокомментируйте это, если я должен удалить вопрос или я должен оставить его здесь, так как другие люди могут прийти вта же ситуация ...

...