在Windows应用商店应用中获取CoreDispatcher的正确方法

lys*_*cid 82 c# dispatcher async-await windows-runtime windows-store-apps

我正在构建一个Windows应用商店应用,我有一些代码需要发布到UI线程.

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

似乎有几种方法可以这样做:

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

// Second way
Window.Current.Dispatcher;
Run Code Online (Sandbox Code Playgroud)

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

MAX*_*AXE 143

这是首选方式:

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

它的优点是它获得了主要因素CoreApplicationView,因此始终可用.更多细节在这里.

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

第一种选择

Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher
Run Code Online (Sandbox Code Playgroud)

这将获取应用程序的活动视图,但如果未激活任何视图,则会为您提供null.更多细节在这里.

第二种选择

Window.Current.Dispatcher
Run Code Online (Sandbox Code Playgroud)

当从另一个线程调用它时,此解决方案将无效,因为它返回null而不是UI Dispatcher.更多细节在这里.

  • 请注意(至少在Windows 8.1中)DispatcherPriority现在是CoreDispatcherPriority (3认同)
  • 只要我们有单个ASTA(应用程序单线程单元),这就可以工作.如果我们引入"共享目标"功能,则有多个ASTA(每个都有自己的调度程序).然后CoreApplication.MainView可以为null(因为它的ASTA尚未初始化).意识到! (2认同)

Bre*_*ngs 15

对于任何使用C++/CX的人

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