导航到页面时内存不足-异常
本文关键字:内存不足 异常 导航 | 更新日期: 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当我有图像在我的列表框?