|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
c++是语言,其实C++和net网页编程的应用范围根本就不一样的。在net网页编程应用的领域内,c++是不合适的。所以微软才搞了C#和net网页编程对抗。WPF4.5已改善了其关于多线程数据绑定的撑持,但所用手艺却带有风险。本文将会先容其事情道理和怎样才干确保平安利用。
WPF数据绑定关于多线程的撑持一向都没甚么详细企图。当对象在非UI线程上收回了属性变更事务时,数据绑定基本举措措施就会对其作出呼应。一般这是可行的,但由于潜伏的竞态前提,这么做并非真正平安的。从盘算机迷信的视角来看,禁用跨线程的会见是更加准确的做法,由于这才是招致汇合变更事务的本源。
但遗憾的是,开辟者其实不老是在乎准确性,他们只是想把事变做完。如许,他们会利用各类“线程平安”或是“分发平安”的可观察汇合。在一切这些做法中,基础的计划就是在挪用前将汇合变更的事务编排到准确的线程中。在这类情形下,准确的线程就是分发者所运转的谁人线程。但遗憾的是,这么做并未打消竞态前提的大概性。
在WPF4.5中,微软向开辟者供应了一种更加平安的办理计划。经由过程挪用BindingOperations.EnableCollectionSynchronization,WPF数据绑定引擎会利用锁。其默许举动是取得前述挪用所指定对象上的锁,但你也能够利用更加庞大的锁形式。但遗憾的是,这类体例很简单堕落;关于背景线程来讲,你很简单健忘取得汇合的锁。当汇合不再必要时,你还大概健忘禁用汇合同步,这会招致内存保守。
该手艺的另外一个成绩是它其实不会回护单个对象。如许当在锁下读取汇合时,汇合中每项的属性就纷歧定可以包管会被平安读取。这关于庞大的getters和没法以原子体例举行设置的属性来讲极易发生成绩(好比说年夜的值范例)。
我们激烈倡议利用背景线程的开辟者只利用汇合中的稳定对象来更新汇合。假如对象没法包管是稳定的,那末最少在确保属性getters的线程平安上要分外当心。当向汇合中增加对象时,你最好不要利用该特征,而是将汇合更新编排到UI线程中。
检察英文原文:MultithreadingandWPF4.5
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。 |
|