相关文章推荐
腹黑的爆米花  ·  WPF异常“调用线程无法访问此对象,因为另一 ...·  2 月前    · 
喝醉的镜子  ·  WPF 线程操纵UI问题 - Lulus ·  2 月前    · 
奔跑的茄子  ·  C# ...·  2 月前    · 
千杯不醉的绿茶  ·  WPF combobox ...·  1 月前    · 
高大的拐杖  ·  wpf ...·  3 天前    · 
英姿勃勃的香槟  ·  使用Python将XML转换为JSON?·  1 年前    · 
光明磊落的烤面包  ·  贾跃亭辞任乐视网总经理,乐视网将走向何方?- ...·  1 年前    · 
乐观的甘蔗  ·  如何从PostgreSQL ...·  1 年前    · 
小胡子的皮带  ·  SpringBoot集成AWS S3 ...·  1 年前    · 
淡定的水煮肉  ·  js判断一个数组中含有另一个数组的某一项_V ...·  1 年前    · 
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异常“调用线程无法访问此对象,因为另一个线程拥有该对象 ”_wpf richtextbox 调用线程无法访问此对象,因为另一个线程拥有该对象。
2 月前
喝醉的镜子  ·  WPF 线程操纵UI问题 - Lulus
2 月前
奔跑的茄子  ·  C# 在winform或者wpf中显示控制台窗口 - qqnihao
2 月前
千杯不醉的绿茶  ·  WPF combobox selectionchanged and triggered the listbox scroll/locate to the selected item cooperate
1 月前
高大的拐杖  ·  wpf 设置无边框的透明button_wpf button去除边框
3 天前
英姿勃勃的香槟  ·  使用Python将XML转换为JSON?
1 年前
光明磊落的烤面包  ·  贾跃亭辞任乐视网总经理,乐视网将走向何方?-经济观察网
1 年前
乐观的甘蔗  ·  如何从PostgreSQL json中提取数组-阿里云开发者社区
1 年前
小胡子的皮带  ·  SpringBoot集成AWS S3 生成预签名url进行上传文件到S3_amazons3.generatepresignedurl_小诺大人的博客-CSDN博客
1 年前
淡定的水煮肉  ·  js判断一个数组中含有另一个数组的某一项_Volon Kou的博客-CSDN博客
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号