将BitmapImage设置为null时,内存不会被释放

我有一个对象集合,每个对象包含一个BitmapImage。 我把这个集合绑定到FlipView。 当用户在FlipView中翻转页面时,所选对象的BitmapInmage将从ApplicationData加载,并将前一个对象的BitmapImage设置为null以释放内存。 问题是,内存永远不会松懈,应用程序在翻转一段时间后崩溃。 当我查看集合时,只有实际项目设置了BitmapImage,所有其他项目都将其设置为null。 那么我该如何减轻记忆?

我加载图片的方式:

StorageFile s = await ApplicationData.Current.LocalFolder.GetFileAsync(localFilename); BitmapImage bitmapImage = new BitmapImage(); using (var stream = await s.OpenAsync(FileAccessMode.Read)) { bitmapImage.SetSource(stream); } return bitmapImage; 

编辑:我认为问题可能是我加载图像的方式,我想文件流不会被释放

我在Windows Phone 7应用程序中遇到了类似的问题。

一个对我有用的技巧是从父元素中删除图像。

 grid1.Children.Remove(image1); image1 = null; 

我不确定这对你的情况是否有帮助。

我的博文中有关此问题的更多详细信息。

对我来说有用的是在将对象本身设置为null之前将UriSource属性设置为null。

如果这些图像使用大量内存,那么强制垃圾收集释放内存可能是有意义的。 这仅在您删除了对内存的所有强引用时才有效。 如果您在强制垃圾收集方面过于激进,则可能会遇到性能问题,因此您需要对此进行试验。 例如,您可能只想在“清空”一些图像后强制收集。

您可以使用GC.Collect方法强制进行垃圾回收。

http://msdn.microsoft.com/en-us/library/bb384155.aspx

如果您在UWP中使用x:Bindings,您可能会发现类似的问题,但是,如果在清除类之后运行Bindings.Update()(假设您的图像在类中,保存在可观察的集合中),则首先运行.Clear()在ObservableCollection上,然后是Bindings.Update(),然后你就会发现你的意志会重新获得自由空间。

在.net中设置为null的东西永远不会做任何事情 – GC是无关的并且在它选择时发生。 相反,检查图像是否实现了IDisposable:如果是,则应该在完成后调用Dispose()。 护城河通常,您可以通过“使用”声明自动执行此操作:

 using(var img = GetImage()) { // todo: some stuff involving img }