相关文章推荐
悲伤的拖把  ·  一款软件无法正常打开,疑似WPF工作异常,是 ...·  5 天前    · 
没有腹肌的苹果  ·  在Anaconda安装多个环境,如果想在每个 ...·  1 年前    · 
高兴的红酒  ·  SQLSERVER 表名数据库名作为变量 ...·  2 年前    · 
睿智的黄瓜  ·  C语言 十进制和二进制相互转换 - ...·  2 年前    · 
独立的松鼠  ·  用安卓系统传输AAC音频·  2 年前    · 
另类的饭盒  ·  Digital Micrograph3.2 ...·  2 年前    · 
Code  ›  WPF 图片移除视觉树内存泄漏开发者社区
内存泄漏 wpf
https://cloud.tencent.com/developer/article/1584711
知识渊博的单车
1 年前
林德熙

WPF 图片移除视觉树内存泄漏

腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
林德熙
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > WPF 图片移除视觉树内存泄漏

WPF 图片移除视觉树内存泄漏

作者头像
林德熙
发布 于 2020-02-17 14:50:50
1K 0
发布 于 2020-02-17 14:50:50
举报
文章被收录于专栏: 林德熙的博客 林德熙的博客

本文告诉大家一个已知问题,在保存图片元素对象时,如果在图片移除视觉树之后再设置图片源为空,那么原有的图片源依然被图片元素引用不会释放

如写一个按钮,在点击事件里面创建 RenderTargetBitmap 加入到新建的图片元素,然后在下次点击事件时,将图片元素从视觉树移除之后设置图片源为空

        private void Button_Click(object sender, RoutedEventArgs e)
            // 每次点击此按钮会将当前呈现的图片移除视觉树,再将其Source属性设置为null。
            // 然后新建一个Image控件,并将其Source属性设置为RenderTargetBitmap对象,再呈现出来。
            // 再次过程中,RenderTargetBitmap对象从来不会被回收,造成内存泄露。
            // 可以从资源管理其中观察到程序的内存持续上涨的现象。
            // Remove the current Image control from the  visual tree and set source is null when click button.
            // Then new a image control and add source to the RenderTargetBitmap object and show it.
            // You can see the gc never delete the RenderTargetBitmap object that make  memory leak.
            var oldBorder = RootGrid.Children.OfType<Border>().LastOrDefault();
            if (oldBorder != null)
                var oldImage = (Image)oldBorder.Child;
                // 如果在Image控件移除视觉树之前将其Source属性设为null,并调用UpdateLayout方法。
                // 则RenderTargetBitmap对象可被回收,不会导致内存泄露。
                // 取消注释下面的代码可以观察到上述现象。
                // In order to solve it , you should set the image.Source is null and use UpdateLayout.
                // The below code can solve it.
                // oldImage.Source = null;
                // oldImage.UpdateLayout();
                // 将当前的Image控件移除视觉树。
                // Remove the current Image control from the  visual tree.
                RootGrid.Children.Remove(oldBorder);
                oldImage.Source = null;
                Borders.Add(oldBorder);
            var bitmap = new RenderTargetBitmap(1024, 1024, 96, 96, PixelFormats.Default);
            var image = new Image { Source = bitmap };
            var border = new Border { Child = image };
            RootGrid.Children.Add(border);
            // 为了便于观察内存的变化,每次操作后都会进行垃圾回收。
 
推荐文章
悲伤的拖把  ·  一款软件无法正常打开,疑似WPF工作异常,是不是.NET框架的问题? - Microsoft Q&A
5 天前
没有腹肌的苹果  ·  在Anaconda安装多个环境,如果想在每个环境下都可以使用jupyterlab,需要挨个安装一遍吗? - 品颜完月 的回答 - 知乎
1 年前
高兴的红酒  ·  SQLSERVER 表名数据库名作为变量 必须使用动态SQL(源自网络)_sql 表名为变量_Jane007123的博客-CSDN博客
2 年前
睿智的黄瓜  ·  C语言 十进制和二进制相互转换 - C语言零基础入门教程 - 知乎
2 年前
独立的松鼠  ·  用安卓系统传输AAC音频
2 年前
另类的饭盒  ·  Digital Micrograph3.2 透射电镜数据采集分析 下载安装教学,零基础快速学会_哔哩哔哩_bilibili
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号