如何避免Windows Phone 8应用程序上的System.OutOfMemoryException

时间:2014-06-19 05:29:53

标签: c# .net windows-phone-8 out-of-memory

我们正在开发一个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。如果是这样,我怎么知道我的程序究竟在哪里造成了这个异常)

1 个答案:

答案 0 :(得分:1)

如果在单个页面上显示太多图像,则肯定会消耗大量内存 - 与图像大小成比例。

可能会改变方式,你正在这样做。尝试查看是否可以使用列表控件进行延迟加载,并在资源离开视图端口时清理资源。

memory profiling查看谁不在乐队中。

更新

This SO问题应为helpful too