C#/UWP 中的不同 Dispatcher 方法

问题描述

我发现了 3 种使用调度程序的不同方式

await Windows.UI.Core.CoreWindow.GetForCurrentThread().dispatcher.RunAsync(Windows.UI.Core.CoredispatcherPriority.normal,() =>
{
   // ...
});

await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.dispatcher.RunAsync(Windows.UI.Core.CoredispatcherPriority.normal,() =>
{
   // ...
});

await dispatcher.RunAsync(Windows.UI.Core.CoredispatcherPriority.normal,() =>
{
   // ...
});

我不明白它们之间的区别以及何时使用哪个。我的项目只有一个页面”。哪一种是“最好”的方式?

编辑//抱歉这个问题,目前我还在学习,但没有找到对这个主题的任何解释。

解决方法

所有这些实际上都是命名空间 System.Windows.Threading 中密封类 Dispatcher 的实例。

从一个角度来看,有与类同名的实例是不幸的。另一方面,它很方便,因此无需查找给定的实例名称即可访问它。

通常,您可以使用 Task.Run 从 UI 线程启动后台任务(否则可能会阻止您的 GUI),并且从任务中,您使用调度程序将更新发送到 GUI:

Task.Run(() =>
{
    // background work
    Application.Current.Dispatcher.Invoke(() =>
    {
        // non blocking UI updates 
    });
}

Using the C# Dispatcher in WPF Applications

Build More Responsive Apps With The Dispatcher

,

什么时候用哪个

不要使用它们。

不要让后台线程进入用户界面,而是让用户界面成为应用的“驱动程序”。使用 await 获取异步操作的结果,使用 Progress<T> 报告进度。