2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

多线程与 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:452850
用户头像

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

关注

评论

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

融云通信云服务,助力医疗招聘平台构建行业护城河

融云 RongCloud

通信 医疗 融云

JavaScript刷LeetCode拿offer-滑动窗口

Geek_07a724

JavaScript LeetCode

前端工程师leetcode算法面试必备-二分搜索算法(中)

js2030code

JavaScript LeetCode

深度理解NodeJS事件循环

coder2028

node.js

深入理解Node.js的进程与子进程

coder2028

node.js

发布自己的第一个npm包

格斗家不爱在外太空沉思

npm nodejs 11月月更

使用Vmware创建Centos7虚拟机(安装和配置网络环境、xshell连接、防火墙、yum仓库、磁盘挂载、重启命令)

A-刘晨阳

Linux 运维 vmware 11月月更

深入剖析nodejs中间件

coder2028

node.js

一比一手写迷你版vue,彻底搞懂vue运行机制

hellocoder2029

JavaScript

云栖大会,一场边缘云计算的「超前瞻」之约

阿里云CloudImagine

云栖大会 边缘云

一文读懂Js中的this指向

hellocoder2029

JavaScript

决策树-分类树

烧灯续昼2002

机器学习 决策树 sklearn 11月月更

Vue基础知识整理【建议收藏】

何极光

Vue 基础

如何构建并提高自己的核心竞争力?

老张

核心竞争力

JavaScript刷LeetCode拿offer-双指针技巧Medium篇

Geek_07a724

JavaScript LeetCode

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

编程培训学习零基础应该怎么选择呢

小谷哥

为什么vue3要选用proxy,好处是什么?

hellocoder2029

JavaScript

2022年在线招聘求职行业洞察

易观分析

招聘 在线

BNBDao三三复制公排dapp系统开发

开发微hkkf5566

JavaScript刷LeetCode拿offer-双指针技巧

Geek_07a724

JavaScript LeetCode

Go语言入门11—接口

良猿

Go golang 后端 11月月更

TOGAF架构框架3-ADM架构开发技术

马说IT

架构 TOGAF ADM架构开发方法

前端工程师leetcode算法面试必备-二分搜索算法(下)

js2030code

JavaScript LeetCode

北京web前端学习哪个机构比较好

小谷哥

北京大数据培训学习怎么选

小谷哥

Echarts实现全国地图展示

格斗家不爱在外太空沉思

JavaScript eCharts 11月月更

一个非常常见的问题:var、let和const

肥晨

11月月更 js6 js基础

Linux常用基础命令(巨全)

A-刘晨阳

Linux 运维 11月月更 基础命令

【云原生】内存数据库如何发挥内存优势

石臻臻的杂货铺

数据库 SPL 11月月更

怎么从容地拿捏时间?来自富兰克林的启示

无人之路

时间管理

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