Недостаточно памяти - исключение при переходе на страницу

Я делаю простое приложение для Windows Phone 8.1 Silverlight. Идея заключается в том, что я могу сделать запись с изображением (сделанным камерой) и добавить к нему текст заголовка и описания. После сохранения записи на главной странице появляется кнопка для ее просмотра. Итак, я сделал 3 записи, и они перечислены на главной странице, но после перехода на их страницы несколько раз, я получаю NavigationFailed вместе с OutOfMemoryException. Страницы просты, они содержат только 1 изображение вместе с некоторыми текстовыми блоками.

Я думал, что проблема в том, что изображения все еще находятся в памяти, поэтому я пытаюсь установить их в ноль и принудительно запустить сборщик мусора, но это не помогло вообще. Что может вызвать исключение OutOfMemory?

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        string id= "";
        if (NavigationContext.QueryString.TryGetValue("id", out id))
        {
            foreach (cEntry entry in helper.entries)
            { 
                if (entry.id.ToString() == id)
                {
                    textBlock_viewText.Text = entry.text;
                    textBlock_viewTitle.Text = entry.title;

                    using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (userStore.FileExists(entry.imageFileName))
                        {
                            using (IsolatedStorageFileStream imgStream = userStore.OpenFile(entry.imageFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                            {
                                BitmapImage bmp = new BitmapImage();
                                bmp.SetSource(imgStream);
                                image_viewEntryImage.Source = bmp;
                                bmp = null;
                            }
                        }
                    }
                }
            }
        }
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        image_viewEntryImage.Source = null;
        GC.Collect();
    }

2 ответа

Вместо того, чтобы устанавливать bmp как ноль, попробуйте это.

 public static void DisposeImage(BitmapImage image)
{
    Uri uri= new Uri("oneXone.png", UriKind.Relative);
    StreamResourceInfo sr=Application.GetResourceStream(uri);
    try
    {
        using (Stream stream=sr.Stream)
        {
            image.DecodePixelWidth=1; //This is essential!
            image.SetSource(stream);
        }
    }
    catch { }
}

вызовите этот метод и установите source как этот пользовательский метод после того, как bmp получит значение null. GC не может очистить память. подробности здесь. Почему я получаю исключение OutOfMemoryException, когда у меня есть изображения в моем ListBox?

Возможно, вам придется заморозить BitmapImage.

Как описано здесь, существует проблема с WPF (типичная среда разработки для Windows Phone), когда BitmapImages может быть неправильно поддержан. В то время как это было предположительно исправлено некоторое время назад, люди сообщили, что все еще видели проблему в некоторых случаях.

Другие вопросы по тегам