求助!WPF Image控件使用Source关联BitmapImage后内存无法释放问题

adelina2kx 2017-04-24 11:41:55



如图,这是我程序中的关键代码片段
初始化的时候我加载了一个ObservableCollection的图片集合,里面使用的是WPF专用的BitmapImage,它不像Bitmap和Image类型,这个BitmapImage是没有dispose方法的,没有办法手动控制释放资源,这是问题关键之一。

然后我弄了一个按钮触发清除ObservableCollection集合,从而清理UI上的Image控件。结果如下图


可以看到虽然UI上图片的确都没了,但内存占用依旧高达80多万K,占用的内存纹丝不动。

于是我做了一个测试,程序初始化时注释掉lstFileManager.ItemsSource = LVDatas;
也就是说图片集合依旧加载,但是UI模板并不引用它,然后再测试一次清理

如图,这次内存真的被跟着释放掉了,那么问题来了
UI控件的数据源一旦引用了一个数据集合,也许不仅仅是在绑定的控件上生成了引用,可能在程序的其他某些地方也管理着另外一个引用列表,然而改变UI控件的Source却只会改变绑定控件上引用指针,而另外一处引用列表并没有受到影响,依旧占用着资源,所以即便数据集合被Clear了,原先数据集合里的每个对象依旧存在引用,所以不会被回收。
有没有大神知道如何解决这个问题?
这个问题如果不解决的话随着图片列表的翻页,内存占用越来越大,直到程序崩溃
...全文
3039 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhang_Yunan 2018-10-24
  • 打赏
  • 举报
回复
引用 3 楼 zjshishen1210 的回复:
不清楚你这path是什么类型或怎么赋值的,后面的函数没见过。 但是建议绑定bimapimage,使用以下方式加载就不会有内存不释放的问题:

 BitmapImage image = new BitmapImage();
using (FileStream fs = File.OpenRead(film))
 {
 image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;//图像缓存到内存中,不会占用文件,没有被引用时会被自动回收。
image.StreamSource = fs;
image.EndInit();
}
注意的是如果在多线程中设置source,即使已经分配给主线程,也需要冻结对象。
注释完美解决了我的问题。
陈熙老爹 2017-09-27
  • 打赏
  • 举报
回复
是否解决了?
adelina2kx 2017-04-27
  • 打赏
  • 举报
回复
2楼的方法我当然试过了,没用,我截图里的例子就是用了直接清空“绑定集合”的方式清空图片集合,虽然UI上的确不显示图片了,但内存占用依旧存在没有被释放,所以我很纳闷,这个绑定集合一旦被UI绑定后,肯定不止1处地方引用了集合里的对象,所以即便我清空了集合,也只是触发了UI上响应的事件,清空了UI模板对集合的引用,而另外某些地方可能依旧持有对该绑定集合的引用,所以内存一直释放不掉
不远1210 2017-04-26
  • 打赏
  • 举报
回复
不清楚你这path是什么类型或怎么赋值的,后面的函数没见过。 但是建议绑定bimapimage,使用以下方式加载就不会有内存不释放的问题:

 BitmapImage image = new BitmapImage();
using (FileStream fs = File.OpenRead(film))
 {
 image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;//图像缓存到内存中,不会占用文件,没有被引用时会被自动回收。
image.StreamSource = fs;
image.EndInit();
}
注意的是如果在多线程中设置source,即使已经分配给主线程,也需要冻结对象。
Mooyi_水 2017-04-24
  • 打赏
  • 举报
回复
初步估计是你binding的问题, 不过你如果没问题的话你可以试试吧LVDatas 初始值设置为Null来试试;这个初始值以便与内存的回收
Mooyi_水 2017-04-24
  • 打赏
  • 举报
回复
lstFileManager 是哪里来的 你怎么在Xaml 和后台都在给ItemSource绑数据,你要干什么

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧