问题描述
我发现了 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>
报告进度。