84

私は Windows ストア アプリを構築しており、UI スレッドに投稿する必要があるコードがいくつかあります。

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

これを行うにはいくつかの方法があるようです:

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

// Second way
Window.Current.Dispatcher;

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

4

5 に答える 5

153

これは好ましい方法です:

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が返されます。詳細はこちら

第二の選択肢

Window.Current.Dispatcher

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

于 2013-08-28T10:25:07.497 に答える
16

C++/CX を使用しているすべてのユーザー向け

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal,
    ref new Windows::UI::Core::DispatchedHandler([this]()
{
    // do stuff
}));
于 2016-06-07T18:29:55.980 に答える
0

実際、私は次のようなことを提案します。

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

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

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

于 2017-07-11T14:01:49.873 に答える