我们正在开发一个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;
}
但是当打开和关闭应用程序中的某些页面时,它突然存在。即使我在调试模式下运行它,我们也无法获得堆栈跟踪。我只是单行说" System.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。如果是这样,我怎么知道我的程序究竟在哪里造成了这个异常)
答案 0 :(得分:1)
如果在单个页面上显示太多图像,则肯定会消耗大量内存 - 与图像大小成比例。
可能会改变方式,你正在这样做。尝试查看是否可以使用列表控件进行延迟加载,并在资源离开视图端口时清理资源。
请memory profiling查看谁不在乐队中。
This SO问题应为helpful too。