为什么WPF中的UI控件具有线程亲和力?

And*_*ndy 11 c# wpf

为什么创建控件的线程是可以更新它的线程?为什么MS没有让人们能够使用锁定和其他线程同步技术来读取和写入具有多个线程的UI控件上的属性.

Rac*_*hel 13

每个MSDN的简短描述是

WPF的线程模型与具有线程关联性的单线程执行的现有User32线程模型保持同步.其主要原因是互操作性 - 像OLE 2.0,剪贴板和Internet Explorer等系统都需要单线程关联(STA)执行

更长的描述是这样的:

WPF中的大多数对象派生自DispatcherObject,它提供了处理并发和线程的基本结构.WPF基于调度程序实现的消息传递系统.这很像熟悉的Win32消息泵; 实际上,WPF调度程序使用User32消息来执行跨线程调用.

在讨论WPF中的并发时,有两个核心概念需要理解 - 调度程序和线程关联.

在WPF的设计阶段,目标是转移到单个执行线程,但是非线程"关联"模型.当组件使用正在执行的线程的标识来存储某种类型的状态时,就会发生线程关联.最常见的形式是使用线程本地存储(TLS)来存储状态.线程亲和性要求每个逻辑执行线程仅由操作系统中的一个物理线程拥有,这可能会占用大量内存.最后,WPF的线程模型与具有线程关联性的单线程执行的现有User32线程模型保持同步.其主要原因是互操作性 - 像OLE 2.0,剪贴板和Internet Explorer等系统都需要单线程关联(STA)执行.

假设您有使用STA线程的对象,则需要一种在线程之间进行通信的方法,并验证您是否在正确的线程上.这就是调度员的角色.调度程序是一个基本的消息调度系统,具有多个优先级排队.消息示例包括原始输入通知(鼠标移动),框架功能(布局)或用户命令(执行此方法).通过从DispatcherObject派生,您可以创建具有STA行为的CLR对象,并在创建时为其指定调度程序.

你可以在这里阅读完整的文章

就个人而言,我更喜欢WPF的单线程模型而不是必须使用锁定和线程同步技术.该调度员可以用来将消息传递给在主UI线程不同的优先级,这需要广大小的后台进程的照顾,如果你需要任何繁重的处理,那么你仍然可以创建你自己的后台线程.