69

我正在构建Windows应用商店应用,并且需要将一些代码发布到UI线程。在Windows应用商店应用中获取CoreDispatcher的正确方法

为此,我想检索CoreDispatcher并使用它来发布代码。

似乎有几个方法可以做到这一点:

// First way 
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher; 

// Second way 
Window.Current.Dispatcher; 

我不知道哪一个是正确的?或者两者是否相同?

+2

两者都是*种类正确的,但是如果您没有从已经*拥有访问分派器的东西访问它,它将是空的。如果你想在ViewModel或Controller中使用它,那么你需要关闭Dispatcher,通常作为App.xaml.cs或IOC控制器中的一个静态属性,并从第一页你有负载。 – 2013-05-10 17:01:06

回答

113

这是首选的方法:

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
() => 
{ 
    // Your UI update code goes here! 
}); 

这样做的好处是,它得到的主要CoreApplicationView,因此始终可用。更多详情here

您可以使用两种替代方案。

第一备选方案

Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher 

这得到了应用程序的活动视图,但是这会给你,如果没有意见已被激活。更多详情here

第二个选择

Window.Current.Dispatcher 

当它从另一个线程调用它返回代替UI调度此解决方案将无法工作。更多详情here

+0

我试过这个,但是当我跟踪代码时,委托代码仍然在工作线程上执行,而不是“主线程”。 – 2014-02-03 17:48:43

+3

请注意(至少在Windows 8.1中)DispatcherPriority现在是CoreDispatcherPriority – Illidan 2014-04-06 10:32:25

+0

简明!典型的微软优雅。 – devios1 2016-12-05 19:25:28

3
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
      CoreDispatcherPriority.Normal, 
      () => { // your code should be here}); 
10

对于使用C++/CX

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal, 
    ref new Windows::UI::Core::DispatchedHandler([this]() 
{ 
    // do stuff 
})); 
+1

这就是C++/CX,而不是C++。区别是相关的,因为Windows运行时也有一个标准C++投影:[C++/WinRT](https://github.com/Microsoft/cppwinrt)。 – IInspectable 2017-02-20 11:36:31

+0

好点 - 更新! – 2017-02-21 22:31:51

0

其实任何人,我想在这行提出的东西:

return (Window.Current == null) ? 
    CoreApplication.MainView.CoreWindow.Dispatcher : 
    CoreApplication.GetCurrentView().CoreWindow.Dispatcher 

这样一来,如果您有双头呆另一个View/Window,你不会得到调度员困惑...

This小宝石检查是否有一个窗口。如果没有,请使用MainView的分派器。如果有视图,请使用该人员的分派器。

相关问题