2

我有一个对象集合,每个对象都包含一个 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;

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

4

5 回答 5

1

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

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

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

不过,我不确定这是否会对您的情况有所帮助。

有关此问题的更多详细信息,请参阅我的博客文章

于 2012-10-21T21:20:47.753 回答
1

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

于 2013-05-27T01:28:04.733 回答
0

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

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

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

于 2012-10-20T12:40:54.030 回答
0

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

于 2016-02-19T11:58:03.330 回答
-1

在 .net 中,将某些内容设置为 null永远不会执行任何操作 - GC 是不相关的,并且会在它选择时发生。相反,请检查图像是否实现了 IDisposable:如果是,则应在完成后调用 Dispose()。护城河通常,您会通过“使用”语句自动执行此操作:

using(var img = GetImage()) {
    // todo: some stuff involving img
}
于 2012-10-20T12:42:54.997 回答