locked
Утечка памяти RRS feed

  • Вопрос

  • Добрый день.

    В приложении проблема с утечкой памяти, при каждом заходе на страницу памяти отжирается на 1 мегабайт больше.

    Вот основной код вывода изображений на эту страницу:

    private void ShowImage(IsolatedStorageFile appStorage, string Path)
        {
            // Читаем изображения из изолированного хранилища
            using (IsolatedStorageFileStream Stream = appStorage.OpenFile(Path, FileMode.Open))
            {
                // Формируем элемент Image
                Image Img = new Image();
                Img.Height = 160;
                Img.Width = 250;
                Img.Margin = new Thickness(10);
    
                // Читаем поток и заносим результат в WriteableBitmap
               >>> WriteableBitmap wb = PictureDecoder.DecodeJpeg(Stream); <<<// Вот тут в конце концов выводится исключение: System.OutOfMemoryException 
                Img.Source = wb;
                Stream.Close();
    
                // Выводим изображения из директории Up на страницу
                PhotoPanel.Children.Add(Img);
    
                // Чистим мусор
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }
        }

    Что может вызывать утечку памяти?

    p.s. я недавно перешел на WPF с WinForms, поэтому не знаю всех нюансов.

    p.p.s. пробовал вот так:

    private void PhoneApplicationPage_Unloaded(object sender, RoutedEventArgs e)
       
    {
           
    PhotoPanel = null;
            GC
    .Collect();
            GC
    .WaitForPendingFinalizers();
            GC
    .Collect();
       
    }

    тоже без результатно.

    15 декабря 2013 г. 17:52

Ответы

  • 1.Используйте для показа BitmapImage

    2. При использовании BitmapImage пямять тоже подтекает. Лечится так: 

    BitmapImage img = new BitmapImage();//Допустим это полноценная картинка
    img.UriSource = null;
    img=null;
    У меня работает.
    15 декабря 2013 г. 19:14

Все ответы

  • 1.Используйте для показа BitmapImage

    2. При использовании BitmapImage пямять тоже подтекает. Лечится так: 

    BitmapImage img = new BitmapImage();//Допустим это полноценная картинка
    img.UriSource = null;
    img=null;
    У меня работает.
    15 декабря 2013 г. 19:14
  • Благодарю, выручили. Память действительно подтекает - но совсем немного по сравнению с моим предыдущем вариантом.

    16 декабря 2013 г. 5:56
  • 1.Используйте для показа BitmapImage

    2. При использовании BitmapImage пямять тоже подтекает. Лечится так: 

    BitmapImage img = new BitmapImage();//Допустим это полноценная картинка
    img.UriSource = null;
    img=null;
    У меня работает.

    Еще вопрос, а как быть если изображение задается из Stream? Ведь по Uri адресу насколько мне известно не получить изображение из изолированного хранилища.

    Там уже другое свойство задает его:

    BitmapImage.SetSource(Stream);



    16 декабря 2013 г. 10:23
  • передавайте null.
    16 декабря 2013 г. 10:38
  • передавайте null.

    Не получается, генерируется исключение. Вот полный код очистки:

    Пробовал и с UriSource - память не освобождается.
    16 декабря 2013 г. 12:10
  • (BitmapImage1 = null) == (Img1.Source = null) если вы поняли о чем я, потому что это ссылочные типы и BitmapImage1 = Img1.Source as BitmapImage не что инное как получение ссылки

    Другое дело, что в Image.Source могут быть проверки на NULL.

    Еще лучше уходить от программирования на основе событий в сторону MVVM. Лично по мне так данные контролировать проще и часть операций выполняет сам фреймворк без лишних телодвижений разработчика.

    17 декабря 2013 г. 16:30
  • (BitmapImage1 = null) == (Img1.Source = null) если вы поняли о чем я, потому что это ссылочные типы и BitmapImage1 = Img1.Source as BitmapImage не что инное как получение ссылки

    Другое дело, что в Image.Source могут быть проверки на NULL.

    Еще лучше уходить от программирования на основе событий в сторону MVVM. Лично по мне так данные контролировать проще и часть операций выполняет сам фреймворк без лишних телодвижений разработчика.

    В общем проблема гораздо глубже чем я думал.  Благо на "стековерфлов" набрел на эту тему, пост отмеченный как правильный ответ помог: ссылка

    p.s. я одного не понимаю, как со времен WP 7 не придумали адекватного решения для этой задачи.


    17 декабря 2013 г. 17:32