web-dev-qa-db-ja.com

WindowsストアアプリでCoreDispatcherを取得する正しい方法

Windowsストアアプリを作成していますが、UIスレッドに投稿する必要があるコードがあります。

そのために、CoreDispatcherを取得し、それを使用してコードを投稿したいと思います。

そうするいくつかの方法があるようです:

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

// Second way
Window.Current.Dispatcher;

どちらが正しいのだろうか?または両方が同等である場合は?

82
lysergic-acid

これが推奨される方法です。

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

これの利点は、メインCoreApplicationViewを取得するため、常に利用できることです。詳細 こちら

使用できる選択肢は2つあります。

最初の選択肢

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

これにより、アプリのアクティブビューが取得されますが、ビューがアクティブ化されていない場合は、nullが返されます。詳細 こちら

2番目の選択肢

Window.Current.Dispatcher

このソリューションは、UI Dispatcherの代わりにnullを返すため、別のスレッドから呼び出されると機能しません。詳細 こちら

142
MAXE

C++/CXを使用している場合

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal,
    ref new Windows::UI::Core::DispatchedHandler([this]()
{
    // do stuff
}));
13
Brett Pennings
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
            CoreDispatcherPriority.Normal,
            () => { // your code should be here});
3
apramc

実際、私はこれに沿って何かを提案します:

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

そうすれば、別のビュー/ウィンドウをオープンエンドした場合、ディスパッチャが混乱することはありません...

この小さな宝石は、ウィンドウさえあるかどうかをチェックします。存在しない場合は、MainViewのDispatcherを使用します。ビューがある場合は、そのDispatcherを使用します。

0
J. H.