2009-09-04 91 views

回答

4

编辑。

如果您有一个长时间运行的任务,请使用BackGroundWorker将其委托给后台线程,然后您将不需要使用调度程序将消息传递回UI。 This is a very good article.


它是一个非常宽泛的问题。我建议你从WPF Architecture开始。

在WPF中的大部分对象由 DispatcherObject的,它提供了 基本构造为处理 并发线程和派生。基于由调度员实现的消息系统 ,WPF是 。这个 的工作方式非常类似于熟悉的Win32 消息泵;实际上,WPF 调度程序使用User32消息执行交叉线程调用 。

实际上有两个核心概念,以 在WPF讨论并发 当明白 - 调度和线程 亲和力。

在WPF的设计阶段, 目标是移动到 执行一个线程,而是一个非线程 “affinitized”的模式。线程亲和力 发生在组件使用执行线程的 身份到 时存储某种类型的状态。最常见的 这种常见形式是使用 线程本地存储(TLS)来存储 状态。线程亲和力要求每个逻辑执行线程 仅由 中的一个物理线程拥有,该操作系统可能会变为 内存密集型。最后,WPF的 线程模型与 保持同步,现有的User32线程模型 单线程执行与线程 亲和力。此 的主要原因是互操作性 - OLE 2.0,剪贴板和Internet Explorer等系统都需要单线程 亲和性(STA)执行。

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

+1

嗯..我怀疑是当一个长时间运行的过程发生在用户界面后面,那时候WPF UI将不会响应或使用调度程序线程它可以解决吗? – 2009-09-04 10:35:19