写点什么

严重内存泄漏困扰 WPF

  • 2009-10-19
  • 本文字数:748 字

    阅读完需:约 2 分钟

Windows Presentation Foundation 即 WPF,它代表着 Windows 平台 UI 的未来。微软有其自身的打算,而稍晚于 WPF 的 Silverlight 将占领 Web 和移动设备市场。不过,和任何的新技术一样,都会经历一些问题,如某些相当严重的内存泄漏问题。

我们要讨论诸多内存泄漏。第一个问题已经发现一段时间,但它并没有引起大多程序员的关注,甚至是专家们的注意。引发该问题需要以下条件配合:

  1. 引用对象 X 属性 P 的数据绑定路径
  2. 对象 X 含直接引用或间接引用数据绑定操作的目标对象
  3. 属性 P 通过 PropertyDescriptor 对象而非 DependencyProperty 对象或 PropertyInfo 对象访问

这个问题在 KB 938416 中有详细的描述。

接下来是一个让人极其厌烦的 Bug,它在我们使用一个数据绑定集合代替另外一个时触发。Ayende Rahien 有引发该问题的源代码。 Mike Brown 解释道:

经过深入研究以后,我发现该绑定系统并没有解除对“Name”属性的监听程序,但相关数据已被修改。

这很明显是一个 Bug,它和绑定系统有关。当你注意到数据被修改过,而非解除已有绑定(这次假设 Name 绑定 Textblock)并再次使用该元素,就像重新创建元素集那样。不幸的是,Textblock 从来没有解除该绑定。现在如果让数据变成可观测的集合(必要情况下把匿名类型转换为标准的类)并让该集合触发 CollectionChanged 事件(例如:Data[0]=Data[0]),一切运行正常。

以下的内存泄漏来自于 jgoldb 的微软博客上:

  • 如果初始 HWND 在 XP 上被撤销就会导致 CMilChannel 泄漏
  • 使用绑定的每条线程会导致 ShutdownListener 泄漏
  • 在 XP 的 HW 中创建和消除 WriteableBitmap
  • SW Viewport 3D w/ VisualBrush 和 WB 等,都会在 XP 上引起泄漏问题

除了这些泄漏以外,他还列出了一些其他的常见开发错误导致的内存泄漏,以及一些已修复的WPF 问题。

查看英文原文: Serious Memory Leaks Plague WPF

2009-10-19 21:143459
用户头像

发布了 87 篇内容, 共 25.1 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

【LeetCode】最大二叉树Java题解

Albert

LeetCode 8月月更

RocketMQ高可用设计之主从复制和读写分离

急需上岸的小谢

8月月更

[JS真好玩] 嘘!我改了掘金源代码!1行代码,让表格支持page_size切换,从每页10条变为20条!

HullQin

CSS JavaScript html 前端 8月月更

Spring 全家桶之 Spring Data JPA(四)

小白

8月月更

RT-Thread记录(十、全面认识 RT-Thread I/O 设备模型)

矜辰所致

单片机I/O设备的控制方式 RT-Thread 8月月更 设备模型

电商秒杀系统设计

intelamd

C++多态纯虚函数和抽象类与多态案例(二)

CtrlX

c c++ 面向对象 多态 8月月更

Linux 的十大下载管理器,提升效率杠杠的,偷着乐吧!

wljslmz

Linux 8月月更

大数据训练营一期毕业作业

张大彪

【LeetCode】检查单词是否为句中其他单词的前缀Java题解

Albert

LeetCode 8月月更

千万用户3毫秒内抽奖100名如何实现?

知识浅谈

8月月更

拜托!不要用“ ! = null 做判空了

TimeFriends

8月月更

高绩效研发团队领导者的视野和格局

编程启航栈

7 天学个Go,Go 结构体 + Go range 来学学

梦想橡皮擦

Python 爬虫 8月月更

基于STM32+ESP8266设计物联网产品(重点支持微信小程序一键配网连接腾讯云平台)

DS小龙哥

8月月更

SpringBoot 快速入门(保姆级详细教程)

SpringBoot 2 8月月更

总结

Asha

长安链学习-build_release.sh

长安链

长安链学习 -WEB插件-SmartPlugin

Kubernetes 集群API创建管理

CTO技术共享

Kubernetes 服务网格实现

CTO技术共享

收藏好,程序员必逛的 20 个网站

乌龟哥哥

8月月更

Kubernetes是不是下一个容错域

CTO技术共享

云原生(二十三) | Kubernetes篇之Kubernetes 网络策略(NetworkPolicy)

Lansonli

云原生 k8s 8月月更

Go-Excelize API源码阅读(十六)——GetSheetViewOptions、SetPageLayout

Regan Yue

Go 源码 Excelize 8月日更 8月月更

毕业总结

intelamd

如何在 SAP Spartacus 中编写 ASM-Compatible 的代码

汪子熙

angular SAP Hybris Spartacus 8月月更

模块九毕业设计

Geek_2ce415

头脑风暴:最长公共子序列

HelloWorld杰少

算法 LeetCode 8月月更

Spring 全家桶之 Spring Data JPA(五)

小白

8月月更

Spring 全家桶之 Spring Data JPA(三)

小白

8月月更

严重内存泄漏困扰WPF_.NET_Jonathan Allen_InfoQ精选文章