导航到页面

时间:2015-06-01 14:58:06

标签: c# windows-phone-8.1 out-of-memory windows-phone-sl-8.1

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

我认为问题是图像仍在内存中,这就是为什么我尝试将它们设置为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();
    }

2 个答案:

答案 0 :(得分:0)

您可能需要冻结BitmapImage。

正如here所述,WPF(Windows Phone开发的典型框架)存在一个问题,即BitmapImages可能会被错误地保留。虽然据说它被修复了一段时间,但人们报告说在某些情况下仍然会看到问题。

答案 1 :(得分:0)

不要将bmp设置为null,请尝试此操作。

$a = table::select('name')->where('name', 'LIKE', "%.$term.%")->get();

调用此方法并将source设置为此自定义方法,然后将bmp作为null。 GC无法清除内存。详情请见Why do I get an OutOfMemoryException when I have images in my ListBox?