写点什么

多线程与 WPF 4.5

  • 2012-01-30
  • 本文字数:754 字

    阅读完需:约 2 分钟

WPF 4.5 已经改进了其对于多线程数据绑定的支持,但所用技术却带有风险。本文将会介绍其工作原理以及如何才能确保安全使用。

WPF 数据绑定对于多线程的支持一直都没什么具体计划。当对象在非 UI 线程上发出了属性变化事件时,数据绑定基础设施就会对其作出响应。通常这是可行的,但因为潜在的竞态条件,这么做并不是真正安全的。从计算机科学的视角来看,禁用跨线程的访问是更为正确的做法,因为这才是导致集合变化事件的根源。

但遗憾的是,开发者并不总是在意正确性,他们只是想把事情做完。这样,他们会使用各种“线程安全”或是“分发安全”的可观测集合。在所有这些做法中,基本的设计就是在调用前将集合变化的事件编排到正确的线程中。在这种情况下,正确的线程就是分发者所运行的那个线程。但遗憾的是,这么做并未消除竞态条件的可能性。

在 WPF 4.5 中,微软向开发者提供了一种更为安全的解决方案。通过调用 BindingOperations.EnableCollectionSynchronization ,WPF 数据绑定引擎会使用锁。其默认行为是获得前述调用所指定对象上的锁,但你也可以使用更为复杂的锁模式。但遗憾的是,这种方式很容易出错;对于后台线程来说,你很容易忘记获得集合的锁。当集合不再需要时,你还可能忘记禁用集合同步,这会导致内存泄露。

该技术的另一个问题是它并不会保护单个对象。这样当在锁下读取集合时,集合中每一项的属性就不一定能够保证会被安全读取。这对于复杂的getters 以及无法以原子方式进行设置的属性来说极易产生问题(比如说大的值类型)。

我们强烈建议使用后台线程的开发者只使用集合中的不变对象来更新集合。如果对象无法保证是不变的,那么至少在确保属性getters 的线程安全上要格外小心。当向集合中添加对象时,你最好不要使用该特性,而是将集合更新编排到UI 线程中。

查看英文原文: Multithreading and WPF 4.5

2012-01-30 05:452877
用户头像

发布了 88 篇内容, 共 269.7 次阅读, 收获喜欢 9 次。

关注

评论

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

GpuGeek亮相第三届北京人工智能产业创新发展大会

极客天地

从抵触到真香:95 后程序员用飞算 JavaAI 实现效率翻倍

飞算JavaAI开发助手

百万技术博主实测:AI+Java 一键写程序 ,写一句代码算我输

飞算JavaAI开发助手

国民级产品百度网盘大动作!接入DeepSeek-R1满血版,实现文件秒搜,轻松搭建、管理、调用个人知识库

极客天地

NetScaler 14.1 Build 43.50 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器

sysin

NetScaler

企业级数据可视化的范式演进:基于低代码平台的动态响应式设计方法论

不在线第一只蜗牛

低代码

飞算 JavaAI:支持复杂业务逻辑生成,降低 80% 开发门槛

飞算JavaAI开发助手

如何选择最适合企业持续发展的财务规划方式?

智达方通

企业管理 全面预算管理 财务规划

在Docker中部署DataKit最佳实践

观测云

Docker

Splunk Enterprise 9.4.1 (macOS, Linux, Windows) - 机器数据管理和分析

sysin

Splunk Enterprise

NetScaler Console 14.1 Build 43.50 (ESXi, Hyper-V, KVM, Xen) - 集中管理 NetScaler

sysin

NetScaler

前端如何通过 AI+低代码 提升开发体验

秃头小帅oi

Databend Cloud 通过 SOC 2 和 GDPR 认证,助力用户实现数据安全与隐私保护的双重保障

Databend

活动报名:Voice Agent 技术现状及应用展望丨 3.8 北京

声网

Mac上NTFS读写工具有哪些,读写软件NTFS哪个好?

阿拉灯神丁

Mac软件 Paragon NTFS NTFS 磁盘管理器 Tuxera NTFS2024 磁盘格式读写软件

企业如何搭建技术支持体系?盘点三个需重点关注的方面

贝锐

远控工具 办公 办公效率

Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2025 年 2 月更新)

sysin

iPaaS集成平台与ESB在应用场景上的区别

RestCloud

ESB API 数据集成平台 ipaas 软件集成

飞算 JavaAI 如何让微服务开发快人一步?

飞算JavaAI开发助手

告别重复造轮子!飞算 JavaAI 一键生成工程代码

飞算JavaAI开发助手

揭秘!软件测试开发质量衡量标准全攻略!

不在线第一只蜗牛

软件开发

坚持科技创新发展 天翼云“息壤”构筑国云智能底座

极客天地

多线程与WPF 4.5_.NET_Jonathan Allen_InfoQ精选文章