Dispatcher线程如何在wpf UI控件中工作?
答案 0 :(得分:4)
编辑。
如果您有一个长时间运行的任务,请使用BackGroundWorker将其委托给后台线程,然后您不需要使用调度程序将消息传递回UI。 This is a very good article.
这是一个非常广泛的问题。我建议你从WPF Architecture开始。
WPF中的大多数对象都来源于 DispatcherObject,它提供了 处理的基本结构 并发和线程。 WPF是 基于消息传递系统 由调度员实施。这个 与熟悉的Win32非常相似 消息泵;事实上,WPF 调度程序使用User32消息 执行跨线程调用。
真的有两个核心概念 讨论并发时要明白 在WPF中 - 调度程序和线程 亲和力。
在WPF的设计阶段, 目标是转移到单个线程 执行,但非线程 “亲和”模式。线程亲和力 当组件使用时发生 执行线程的标识 存储某种类型的状态。最多 这种常见的形式是使用 线程本地存储(TLS)来存储 州。线程亲和力要求 每个逻辑执行线程都是 仅由一个物理线程拥有 操作系统,可以成为 记忆密集。最后,WPF的 线程模型与...保持同步 现有的User32线程模型 带线程的单线程执行 亲和力。这个的主要原因 互操作性 - 系统就像 OLE 2.0,剪贴板和Internet 资源管理器都需要单线程 亲和力(STA)执行。
鉴于你有STA的对象 线程,你需要一种方法 在线程之间进行通信 验证你是否正确 线。这里有作用 调度员。调度员是基本的 消息调度系统,用 多个优先排队队列。例子 消息包括原始输入 通知(鼠标移动),框架 功能(布局)或用户命令 (执行此方法)。通过推导 从DispatcherObject,您创建一个 具有STA行为的CLR对象,和 将给出指向a的指针 调度员在创建时。