10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

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

关注

评论

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

LeetCode题解:173. 二叉搜索树迭代器,栈,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

24岁,月薪35k!全靠这份阿里P5-P9知识核心手册+10W字面试题总结

Java架构追梦

Java 阿里巴巴 架构 面试

体验有奖 | 1 分钟 Serverless 部署掌上游戏机,“一行命令”找回小时候的乐趣!

Serverless Devs

如何用EasyRecovery恢复U盘内损坏的数据

淋雨

文件恢复 硬盘数据恢复 Easyrecivery

「跨链网关的模块化进程」插件机制演化

趣链科技

百度第25季黑客马拉松再秀“技术基因”,累计产生创意超7000个

科技热闻

架构实战营毕业设计

eoeoeo

架构实战营

SLB 负载均衡实践

若尘

负载均衡 阿里云 弹性负载均衡 8月日更

分布式拒绝服务 (DDoS) 攻击对企业运维造成的影响分析

九河云安全

手把手教你怎么导入Go语言第三方库「让我们一起Golang」

Regan Yue

后端 Go 语言 8月日更

【吐血整理】大牛耗时一年最佳总结,让你的app体验更丝滑

欢喜学安卓

android 程序员 面试 移动开发

android 工作资料!职场中的中年危机

欢喜学安卓

android 程序员 面试 移动开发

springcloud 微服务日志写入kafka

Rubble

kafka Spring Cloud 8月日更

这些智能合约漏洞,可能会影响你的账户安全!

华为云开发者联盟

区块链 智能合约 安全 形式化验证 华为区块链服务

经验之谈:程序员应该如何学好大数据技术

博文视点Broadview

态势感知一屏可视:数治安全,智理未来

一只数据鲸鱼

网络安全 数据可视化 数据监测 数字孪生

手撸二叉树之二叉搜索树的最近公共祖先

HelloWorld杰少

数据结构与算法 8月日更

混合基础设施下,服务网格(Service Mesh)如何对应用进行统一管理

韩陆

我两年的坚持,值了!

程序员鱼皮

Java JavaScript 腾讯 职场 大前端

华为云UGO:醒醒!你的异构数据库迁移难题有救了

华为云开发者联盟

数据库 迁移 华为云 异构数据库 UGO

CodeDay#8:支付宝都在用的容器技术了解一下

蚂蚁集团移动开发平台 mPaaS

小程序 支付宝小程序 支付宝 移动开发 mPaaS

用微服务架构方式交付云服务产品

用友BIP

容器 微服务 专属云

软件架构模式之微服务架构

架构精进之路

架构 微服务 8月日更

【Git技术专题】如何使用git中的tag进行版本开发控制?

码界西柚

git 8月日更

积极重夺制造霸主地位,英特尔不玩“纳米游戏”了

E科讯

【性能优化实战】Android架构组件Room功能详解

欢喜学安卓

android 程序员 面试 移动开发

Java代码中,如何监控Mysql的binlog?

码农参上

Binlog 实战

【秋招面试专题解析】成功入职头条月薪35K

欢喜学安卓

android 程序员 面试 移动开发

ToastUtil实用封装

Changing Lin

8月日更

如何在渲染之前等待 Axios 数据?

吴脑的键客

大前端 React axios

JVM

ltc

JVM

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