写点什么

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

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

关注

评论

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

火山引擎DataLeap:3步打造“指标管理”体系,幸福里数据中心是这么做的

字节跳动数据平台

大数据 字节跳动 数据管理 指标管理 数据研发

火山引擎DataTester分享:A/B实验中常见的8个错误

字节跳动数据平台

软件测试丨Python学习笔记之内置库科学计算、日期与时间处理

测试人

Python 软件测试 测试开发

ChatGPT:DevSecOps 落地实践的最后一公里

极狐GitLab

DevOps 云原生 Code Review DevSecOps ChatGPT

iTubeGo YouTube Downloader 快速下载视频~

真大的脸盆

Mac 视频下载 网页视频下载 Mac 软件 下载视频

让算力不再成为瓶颈,小红书机器学习异构硬件推理优化之道

小红书技术REDtech

机器学习 架构 异构计算

量化交易系统开发——现货策略

薇電13242772558

量化策略

大家都在用的6大类18款企业协同办公软件盘点

爱吃小舅的鱼

项目管理软件 研发管理软件 文档协同软件

腾讯安全携手行业伙伴,详解攻击面管理(ASM)技术的“拓客”潜力

Geek_2d6073

Vue3迎来升级,全面助力企业数字化转型

引迈信息

低代码开发——进最热的赛道,啃最硬的骨头

引迈信息

前端 低代码 快速开发 JNPF

inBuilder低代码平台开发者分享课丨提交PR的正确姿势

inBuilder低代码平台

融云跨平台 SDK 自动生成技术的探索和实践

融云 RongCloud

sdk 融云 办公效率 通讯 图片资源

车载手势识别技术:未来交通的革命性解决方案

来自四九城儿

在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性?

华秋PCB

电磁 电路 处理器 控制器 抗干扰

如何用一行代码实现监测 OpenAI,大幅提升使用体验

Yestodorrow

可观测性 用户体验 应用性能 ChatGPT

架构实战-毕业设计

程序员小张

「架构实战营」

实践「容器镜像扫描」,Get 云原生应用的正确打开方式

极狐GitLab

Docker DevOps 云原生 DevSecOps 容器镜像

Web3和低代码开发:下一代Web应用开发的合作与创新

加入高科技仿生人

前端 Web 低代码

ChatGPT到来个人如何应对

程序员半支烟

人工智能 职业成长

保密+完整+可用+安全,规避代码安全「马奇诺防线」,构建软件供应链整体安全

极狐GitLab

高可用 DevSecOps geo 代码安全 软件供应链安全

一文看懂数据云平台的“可观测性”技术实践

科技热闻

【换模型更简单】如何用 Serverless 一键部署 Stable Diffusion?

Serverless Devs

云计算 Serverless AIGC

SRE方法论之拥抱风险

不思jo

#运维

国产游戏引擎,竟然用来搞民航

Openlab_cosmoplat

人工智能 开源

基于HTML5智慧产业园三维可视化运维平台

2D3D前端可视化开发

物联网 数字孪生 三维可视化 工业组态 智慧产业园区

教你使用Feign替换RestTemplate

做梦都在改BUG

行业分析| 快对讲-融合会议的应用

anyRTC开发者

音视频 视频会议 快对讲 融合会议 电话会议

腾讯云首发多款领先新品,TDSQL全新特性助力国产化替代提速

科技热闻

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