Windowsストアアプリを作成していますが、UIスレッドに投稿する必要があるコードがあります。
そのために、CoreDispatcherを取得し、それを使用してコードを投稿したいと思います。
そうするいくつかの方法があるようです:
// First way
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher;
// Second way
Window.Current.Dispatcher;
どちらが正しいのだろうか?または両方が同等である場合は?
これが推奨される方法です。
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を返すため、別のスレッドから呼び出されると機能しません。詳細 こちら 。
C++/CXを使用している場合
Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
CoreDispatcherPriority::Normal,
ref new Windows::UI::Core::DispatchedHandler([this]()
{
// do stuff
}));
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
() => { // your code should be here});
実際、私はこれに沿って何かを提案します:
return (Window.Current == null) ?
CoreApplication.MainView.CoreWindow.Dispatcher :
CoreApplication.GetCurrentView().CoreWindow.Dispatcher
そうすれば、別のビュー/ウィンドウをオープンエンドした場合、ディスパッチャが混乱することはありません...
この小さな宝石は、ウィンドウさえあるかどうかをチェックします。存在しない場合は、MainViewのDispatcherを使用します。ビューがある場合は、そのDispatcherを使用します。