none
WPF Помогите найти решение. Нужно при смене изображения, освобождать память предыдущей картинки. RRS feed

  • Вопрос

  • Профилировать не удается, занятая под изображение память показывает как unmanaged - и больше ничего не могу из этого вытянуть(использую ANTS). Ниже приведен код в котором сборщик затирает только каждое третье загруженное изображение, т.е. 2 последних постоянно висят памяти. Это очень критично при больших изображениях.

    private void map()
            {            
                GC.Collect();
                GC.WaitForPendingFinalizers();            
                byte[] buffer = System.IO.File.ReadAllBytes(path);//сюда подставляются image
                MemoryStream ms = new MemoryStream(buffer);
                BitmapImage bitmap33 = new BitmapImage();
                bitmap33.BeginInit();          
                bitmap33.StreamSource = ms;
                bitmap33.EndInit();
                bitmap33.Freeze();
                img.Source = bitmap33; // img это Image лежащая на холсте
            }

    • Изменено GORDec 29 декабря 2013 г. 14:05
    29 декабря 2013 г. 14:05

Ответы

  • Для начала отмечу, что правильный шаблон ручной сборки мусора следующий:

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    То есть мало собрать мусор и дождаться окончания работы финализаторов. Нужно ещё раз после этого собрать мусор, потому что после финализации он опять появится (может появиться).

    Но в данном случае это может и не помочь (проверять лень).

    -----

    Попробуйте вызывать ms.Dispose(). Память выделена именно под MemoryStream. Не забывайте о ключевом слове using для disposable-объектов.

    Также можно попробовать присваивать null объектам, которые уже не нужны.

    29 декабря 2013 г. 14:40

Все ответы

  • Для начала отмечу, что правильный шаблон ручной сборки мусора следующий:

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    То есть мало собрать мусор и дождаться окончания работы финализаторов. Нужно ещё раз после этого собрать мусор, потому что после финализации он опять появится (может появиться).

    Но в данном случае это может и не помочь (проверять лень).

    -----

    Попробуйте вызывать ms.Dispose(). Память выделена именно под MemoryStream. Не забывайте о ключевом слове using для disposable-объектов.

    Также можно попробовать присваивать null объектам, которые уже не нужны.

    29 декабря 2013 г. 14:40
  • Совет дельный, но к сожалению не помог. Так же как и ms.Dispose. Я подозреваю что причина в BitmapImage т.к. именно после new BitmapImage с третьей попытки память высвобождается хоть и не до конца.
    2 января 2014 г. 13:13