DependencyObject.Dispatcher 属性

定义

获取与此 对象关联的 CoreDispatcherCoreDispatcher 表示可以访问 UI 线程上的 DependencyObject 的工具,即使代码是由非 UI 线程启动的。

public:
 property CoreDispatcher ^ Dispatcher { CoreDispatcher ^ get(); };
CoreDispatcher Dispatcher();
public CoreDispatcher Dispatcher { get; }
var coreDispatcher = dependencyObject.dispatcher;
Public ReadOnly Property Dispatcher As CoreDispatcher

属性值

与 DependencyObject 对象关联的 CoreDispatcher,表示 UI 线程。

示例

此示例演示 Dispatcher 用于 Page 的代码隐藏文件的隐式此 。 此示例使用 lambda 表达式添加 DispatchedHandler 实现。 处理程序本身正在处理 Accelerometer.ReadingChanged 事件,该事件不会在 UI 线程上执行。

private async void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        AccelerometerReading reading = e.Reading;
        ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
        ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
        ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
    });
}

注解

Dispatcher 属性提供 CoreDispatcher 引用,该引用可用于封送来自非 UI 线程的调用,使用 RunAsync 和可等待函数。 有关可等待函数的详细信息,请参阅 使用 C# 或 Visual Basic 调用异步 API。 另请参阅 DependencyObject 参考主题的“ DependencyObject 和线程处理”部分。

DependencyObject 必须在 UI 线程上创建,并且与 UI 线程具有关联。 因为它是一个允许跨线程的入口点,DependencyObject.Dispatcher 是 DependencyObject 或其任何子类的唯一实例 API,可以从非 UI 线程访问,而不会引发跨线程异常。 如果尝试从工作线程或其他非 UI 线程调用所有其他 DependencyObject API,则会引发异常。

具体而言,Dispatcher 属性获取与应用 UI 线程关联的 CoreDispatcher 。 如果要查询或更改任何依赖属性的值,则必须通过 CoreDispatcherRunAsync 方法运行代码,即使该对象尚未与 XAML 可视化树或可见 UI (应用窗口的可视根) 相关联。

Window.Dispatcher 还引用与 UI 线程关联的 CoreDispatcherWindow.Dispatcher 基本上只是 CoreWindow.Dispatcher 的包装器,因此 Window 类可以轻松访问它。

注意

Dispatcher 值的连接在设计时视图中不可用。 如果已创建使用 Dispatcher 值的自定义控件,并且设计时环境通过设计视图使用的代码路径(例如构造函数和 加载 处理程序)访问该代码,则这可能会导致问题。 如果在编写自定义控件时遇到此问题,请考虑在代码中引入一个防护条件,例如在 DesignModeEnabled为 true 时不调用该代码。

适用于