it-swarm.com.ru

Правильный способ получить CoreDispatcher в приложении Магазина Windows

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

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

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

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

// Second way
Window.Current.Dispatcher;

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

81
lysergic-acid

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

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

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

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

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

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

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

Второй вариант

Window.Current.Dispatcher

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

140
MAXE

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

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal,
    ref new Windows::UI::Core::DispatchedHandler([this]()
{
    // do stuff
}));
12
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. Если есть представление, используйте этот Диспетчер.

0
J. H.