C# 将BitmapImage设置为null时未释放内存
我有一个对象集合,每个对象包含一个位图图像。我已将此收藏绑定到FlipView。当用户在FlipView中翻页时,所选对象的位图图像将从ApplicationData加载,我将上一个对象的位图图像设置为null以释放内存。问题是,内存永远不会被释放,应用程序在翻转一段时间后崩溃。当我查看集合时,只有实际项设置了BitmapImage,其他所有项都将其设置为null。那么我该如何减轻记忆呢 我加载图像的方式:C# 将BitmapImage设置为null时未释放内存,c#,windows-8,microsoft-metro,windows-runtime,C#,Windows 8,Microsoft Metro,Windows Runtime,我有一个对象集合,每个对象包含一个位图图像。我已将此收藏绑定到FlipView。当用户在FlipView中翻页时,所选对象的位图图像将从ApplicationData加载,我将上一个对象的位图图像设置为null以释放内存。问题是,内存永远不会被释放,应用程序在翻转一段时间后崩溃。当我查看集合时,只有实际项设置了BitmapImage,其他所有项都将其设置为null。那么我该如何减轻记忆呢 我加载图像的方式: StorageFile s = await ApplicationData.Curren
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;
编辑:我认为问题可能在于加载图像的方式,我猜文件流不会被释放如果这些图像使用大量内存,那么强制垃圾收集释放内存可能是有意义的。只有删除了对内存的所有强引用,此操作才有效。如果您在强制垃圾收集方面过于激进,可能会遇到性能问题,因此您需要尝试一下。例如,您可能希望仅在“清空”一些图像后强制收集 您可以使用GC.Collect方法强制垃圾收集
在.net中,将某物设置为null永远不会起任何作用-GC是不相关的,并且在它选择时发生。相反,请检查映像是否实现了IDisposable:如果实现了,则应在完成后调用Dispose()。通常,您会通过“使用”语句自动执行此操作:
using(var img = GetImage()) {
// todo: some stuff involving img
}
我在WindowsPhone7应用程序中遇到了类似的问题 对我有效的一个技巧是从父元素中删除图像
grid1.Children.Remove(image1);
image1 = null;
但我不确定这对你的情况是否有帮助
有关此问题的更多详细信息,请参阅我的。对我有效的方法是在将对象本身设置为null之前将UriSource属性设置为null。如果在UWP中使用x:Bindings,那么如果在清除类后运行Bindings.Update(),则可能会发现类似的问题(假设您的图像在一个类中,保存在一个可观察的集合中),首先在该可观察集合上运行.Clear(),然后运行Bindings.Update(),然后您会发现您将重新获得可用空间。当BitmapImage是我的计算机上的一个属性时,我无法确定如何使用它ViewModel@Igor您可以使视图模型实现IDisposable,并在图像被释放时让视图模型释放图像,然后在完成后释放视图模型?BitmapImage不实现IDisposable