写点什么

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

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

关注

评论

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

一个完整挖洞/src漏洞实战流程【渗透测试】

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

高效的代码版本控制,让你居家办公游刃有余 | 社区征文

代码托管 6月月更 初夏征文 协同开发

Java Core 「12」ReentrantLock 再探析

Samson

学习笔记 Java core 6月月更

如何设计业务高性能高可用存储架构 - 作业

阿拉阿拉幽幽

NodeJS Stream入门 🦺

德育处主任

node.js 6月月更

数据库每日一题---第17天:丢失信息的雇员

知心宝贝

数据库 前端 后端 6月月更

flutter系列之:flutter中常用的box

程序那些事

flutter 程序那些事 6月月更

leetcode 542. 01 Matrix 01 矩阵(中等)

okokabcd

LeetCode 动态规划 数据结构与算法

【PIMF】盘点开源鸿蒙第三方组件(第三方库)【2】

离北况归

OpenHarmony 三方库

千万级学生管理系统的考试试卷存储方案设计

Geek_7a789a

网页设计的发展趋势如何

源字节1号

LabVIEW Arduino RS-485智能农业监测系统(项目篇—4)

不脱发的程序猿

传感器 智慧农业 LabVIEW Arduino RS-485智能农业监测系统

千万级学生管理系统试卷存储方案(架构实战营 模块四作业)

Gor

攻防演练中红队的外网纵向突破口

穿过生命散发芬芳

6月月更 攻防演练

基于Redis sentinel的千万级学生管理系统的考试试卷存储方案

Geek_e8bfe4

C语言中奇妙又有趣的符号——C语言运算(操作)符

未见花闻

6月月更

OKALEIDO:NFT交易平台的发展趋势是什么?

股市老人

架构实战营模块 4 作业

Naoki

架构实战营

千万级学生管理系统考试试卷存储方案

Pengfei

【LeetCode】兼具大小写的最好英文字母Java题解

Albert

LeetCode 6月月更

又回到最初的起点,记忆中你青涩的脸,我们终于来到了这一天

百思不得小赵

阅读 毕业生 6月月更

千万级学生管理系统考试试卷存储方案

地下地上

架构实战营

读书笔记之《网络是怎样连接的》

蔡农曰

开发 网络 计算机 后端开发

Navicat Premium 15 永久破解激活工具及安装教程(亲测可用)

Geek甜甜

数据库 程序员 工具 navicat

架构实战营第四模块作业

Geek_53787a

NFT新范式,OKALEIDO创新NFT聚合交易生态

鳄鱼视界

数据洞察力

奔向架构师

数据资产 6月月更

服务治理的目标与愿景

阿泽🧸

服务治理 6月月更

架构实战营模块 4 作业

Roy

架构实战营

33岁程序员的年中总结

王磊

年中总结

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