本文档已存档,并且将不进行维护。

Dispatcher 类

更新: 2008 年 7 月

提供用于管理线程工作项队列的服务。

命名空间:  System.Windows.Threading
程序集:  WindowsBase(在 WindowsBase.dll 中)

public sealed class Dispatcher
public final class Dispatcher
public final class Dispatcher
无法直接在 XAML 中创建此类的实例。

Dispatcher 可为特定线程维护其按优先顺序排列的工作项队列。

当在线程中创建了 Dispatcher 时,它将成为可与该线程关联的唯一 Dispatcher,即使 Dispatcher 已经关闭。

如果尝试获取当前线程的 CurrentDispatcher,而此时该线程没有关联的 Dispatcher,则将创建一个 Dispatcher

如果 Dispatcher 已经关闭,它将无法重新启动。

在 WPF 中,DispatcherObject 只能通过与它关联的 Dispatcher 进行访问。例如,后台线程不能更新与 UI 线程中的 Dispatcher 关联的 Button 内容。为了使该后台线程能够访问 ButtonContent 属性,该后台线程必须将此工作委托给与该 UI 线程关联的 Dispatcher。这可以通过使用 InvokeBeginInvoke 来完成。Invoke 是同步操作,而 BeginInvoke 是异步操作。该操作将按指定的 DispatcherPriority 添加到 Dispatcher 的队列中。

如果对某个已关闭的 Dispatcher 调用 BeginInvoke,则返回的 DispatcherOperation 的状态属性将设置为 Aborted

DisableProcessing 以外,Dispatcher 上的所有方法均是自由线程的。

派生自 DispatcherObject 的对象具有线程关联。

派生自 Freezable 的对象在冻结时是自由线程的。有关更多信息,请参见Freezable 对象概述

下面的示例演示如何在 Dispatcher 中放置操作。有关此示例的完整源代码,请参见具有长时间运行计算的单线程应用程序示例

首先,将创建一个不接受任何参数的委托。

public delegate void NextPrimeDelegate();


接下来,调用 BeginInvoke(DispatcherPriority, Delegate)。对 BeginInvoke(DispatcherPriority, Delegate) 的这一调用采用了两个参数:一个是优先级,设置为 DispatcherPriority.Normal;另一个是回调,它通过委托 NextPrimeDelegate 的实例传入。

startStopButton.Dispatcher.BeginInvoke(
    DispatcherPriority.Normal,
    new NextPrimeDelegate(CheckNextNumber));


System.Object
  System.Windows.Threading.Dispatcher

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

Windows Vista

.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

.NET Framework

受以下版本支持:3.5、3.0
显示: