Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将BitmapImage设置为null时未释放内存_C#_Windows 8_Microsoft Metro_Windows Runtime - Fatal编程技术网

C# 将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

我有一个对象集合,每个对象包含一个位图图像。我已将此收藏绑定到FlipView。当用户在FlipView中翻页时,所选对象的位图图像将从ApplicationData加载,我将上一个对象的位图图像设置为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;

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

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

您可以使用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