如何避免系统.windows phone 8应用程序OutOfMemoryException异常
本文关键字:应用程序 OutOfMemoryException 异常 phone 何避免 系统 windows | 更新日期: 2023-09-27 18:09:22
我们正在开发一个windows phone 8应用程序(聊天应用程序)。在应用程序中,我们需要在几个页面上显示联系人的图像。我们将ImageUri绑定到图像源,并使用转换器返回BitmapImage。
BitmapImage image = new BitmapImage();
try
{
var path = (Uri)value;
if (!String.IsNullOrEmpty(path.ToString()))
{
using (var stream = LoadFile(path.ToString()))
{
if (stream != null)
{
image.SetSource(stream);
}
else
{
image = new BitmapImage();
image.UriSource = (Uri)value;
}
}
return image;
}
}
在LoadFile()中,我们在IsolatedStorage中搜索文件。
private Stream LoadFile(string file)
{
Stream stream=null;
using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if(isoStore.FileExists(file))
stream = isoStore.OpenFile(file, System.IO.FileMode.Open, System.IO.FileAccess.Read);
}
return stream;
}
但是当打开和关闭应用程序中的某些页面时,它突然存在。即使在调试模式下运行,我们也无法获得堆栈跟踪。我只是得到一行,说"系统类型的第一次异常。OutOfMemoryException发生"。我在网上搜索解决这个问题,找到了一些解决方案。它们都说加载这么多位图会导致这个异常我需要在每次停止使用资源时处理它。我为我的图像控件写了一个行为,
void AssociatedObject_Unloaded(object sender, System.Windows.RoutedEventArgs e)
{
var image = sender as Image;
if (image != null)
{
BitmapImage bitmapImage = image.Source as BitmapImage;
bitmapImage.UriSource = null;
using (var stream = LoadFile("Images/onebyone.png"))
{
if (stream != null)
{
bitmapImage.SetSource(stream);
}
}
}
}
在这里的LoadFile()方法中,我正在读取一个1x1像素的图像。即使这样做之后,我仍然得到相同的异常。我怎么解决这个问题?(除了加载太多控件外,任何其他代码都会导致OutOfMemoryException。如果是这样,我怎么知道我的程序究竟在哪里导致这个异常?
如果在一个页面上显示太多的图像,它肯定会消耗大量的内存-与您的图像大小成比例。
可能是改变方式,你正在做它。试着看看你是否可以对列表控件使用延迟加载,并在资源离开视图端口时清除它们。
执行内存分析以查看谁将超出带宽
更新