0

Dispatcher 线程如何在 wpf UI 控件中工作?

4

1 回答 1

4

编辑。

如果您有一个长时间运行的任务,请使用 BackGroundWorker 将其委托给后台线程,然后您就不需要使用调度程序将消息传递回 UI。这是一个非常不错的文章。


这是一个非常广泛的问题。我建议您从WPF Architecture开始。

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

在讨论 WPF 中的并发性时,实际上有两个核心概念需要理解——调度程序和线程亲和性。

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

鉴于您有带有 STA 线程的对象,您需要一种在线程之间进行通信的方法,并验证您是否在正确的线程上。这就是调度员的作用。调度程序是一个基本的消息调度系统,具有多个优先队列。消息的示例包括原始输入通知(鼠标移动)、框架函数(布局)或用户命令(执行此方法)。通过从 DispatcherObject 派生,您可以创建一个具有 STA 行为的 CLR 对象,并且在创建时将获得一个指向调度程序的指针。

于 2009-09-04T10:26:09.427 回答