将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方法强制进行垃圾回收。
https://msdn.microsoft.com/en-us/library/bb384155.aspx
如果您在UWP中使用x:Bindings,您可能会发现类似的问题,但是,如果在清除类之后运行Bindings.Update()(假设您的图像在类中,保存在可观察的集合中),则首先运行.Clear()在ObservableCollection上,然后是Bindings.Update(),然后你就会发现你的意志会重新获得自由空间。
在.net中设置为null的东西永远不会做任何事情 – GC是无关的并且在它选择时发生。 相反,检查图像是否实现了IDisposable:如果是,则应该在完成后调用Dispose()。 护城河通常,您可以通过“使用”声明自动执行此操作:
上述就是C#学习教程:将BitmapImage设置为null时,内存不会被释放分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
using(var img = GetImage()) { // todo: some stuff involving img }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/956457.html