Правильный способ получения CoreDispatcher в приложении Windows Store

Я создаю приложение для Windows Store, и у меня есть код, который нужно отправить в поток пользовательского интерфейса.

Для этого я хотел бы получить CoreDispatcher и использовать его для публикации кода.

Кажется, есть несколько способов сделать это:

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

// Second way
Window.Current.Dispatcher;

Интересно, какой из них правильный? или если оба эквивалентны?

Ответ 1

Это предпочтительный способ:

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

Преимущество заключается в том, что он получает основной CoreApplicationView и поэтому всегда доступен. Подробнее здесь.

Есть две альтернативы, которые вы могли бы использовать.

Первая альтернатива

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

Это получает активное представление для приложения, но это даст вам значение null, если никакие представления не были активированы. Подробнее здесь.

Вторая альтернатива

Window.Current.Dispatcher

Это решение не будет работать, если оно вызвано из другого потока, поскольку оно возвращает null вместо диспетчера интерфейса. Подробнее здесь.

Ответ 2

Для тех, кто использует С++/CX

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

Ответ 3

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

Ответ 4

Собственно, я бы предложил что-то в строке этого:

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

Таким образом, если у вас есть openend другого View/Window, вы не получите Dispatchers смущенным...

Этот маленький жемчуг проверяет, есть ли даже Окно. Если нет, используйте диспетчер MainView. Если есть представление, используйте этот диспетчер.