写点什么

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

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

关注

评论

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

架构师训练营-作业4

紫极

week4 命题作业

小叶

极客大学架构师训练营

架构师训练营第四周作业和小记

tuuezzy

架构师 极客大学架构师训练营

大型互联网应用的发展和未来

拈香(曾德政)

互联网 极客大学架构师训练营 互联网架构 互联网架构的演进

04周作业——互联网系统架构

dao

极客大学架构师训练营 作业

架构师训练营第 4 周作业

Season

极客大学架构师训练营

一周风云之互联网构架演进

Dawn

互联网系统架构总结

紫极

架构师训练营Week04homework

Nick

极客大学架构师训练营

架构师训练营第四周

跨域刀

极客大学架构师训练营

总结04-互联网架构演化

梦子说

课程作业

面向对象学习

一叶知秋

第四周 - 学习总结

molly

极客大学架构师训练营

Week 04 作业

鱼_XueTr

架构

架构师训练营week04 summary

Nick

极客大学架构师训练营

架构师第四课总结

Dennis

第四周总结

证明谁才是第一

架构师训练营第四周总结

allen

架构模式和重构

GalaxyCreater

架构

大型互联网应用系统所使用的技术方案

olderwei

极客大学架构师训练营

大规模复杂系统如何架构(一)?

李小匪

架构 极客大学架构师训练营

架构师训练营第四周总结

跨域刀

极客大学架构师训练营

深入解析典型的大型互联网应用系统

拈香(曾德政)

互联网 架构师 极客大学架构师训练营 互联网架构 互联网应用技术方案

系统架构知识是架构师的常识而不是能力(第 4 周学习总结)

李德政

极客大学架构师训练营

架构师训练营 - 总结4

进击的炮灰

分布式系统架构学习总结(第四周)

吴建中

极客大学架构师训练营

架构师训练营第四周课后总结

Cloud.

第四周作业 - 命题作业

molly

极客大学架构师训练营

架构师课作业 - 第四周

Tulane

互联网架构演进的学习思考

架构5班杨娟Jessie

极客大学架构师训练营

系统架构

olderwei

极客大学架构师训练营

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