导航到页面时内存不足-异常

本文关键字:内存不足 异常 导航 | 更新日期: 2023-09-27 17:51:19

我正在制作一个简单的Windows Phone 8.1 Silverlight应用程序。我的想法是,我可以用照片(用相机拍摄)制作一个条目,并添加标题和描述文本。保存条目后,主页上会出现一个按钮来查看它。所以我做了3个条目,它们在主页上列出,但在导航到他们的页面几次后,我得到了一个NavigationFailed和OutOfMemoryException。这些页面很简单,它们只包含一张图像和一些文本块。

我认为问题是图像仍然在内存中,这就是为什么我试图将它们设置为null并强制垃圾收集器,但这根本没有帮助。什么可能导致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();
    }

导航到页面时内存不足-异常

你可能需要冻结BitmapImage

正如这里所描述的,WPF (Windows Phone开发的典型框架)有一个问题,BitmapImages可能不正确地保持活跃。虽然这个问题早在一段时间前就被修复了,但仍有人报告在某些情况下看到这个问题。

与其将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当我有图像在我的列表框?