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


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

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

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

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

// Second way
Window.Current.Dispatcher;

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

4 75

4 ответа:

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

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 вместо пользовательский интерфейс диспетчера. Более подробная информация здесь.

для всех, кто использует 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

таким образом, если у вас есть openend другой вид/окно, вы не получите диспетчеры путают...

этот маленький драгоценный камень проверяет, есть ли вообще окно. Если нет, используйте диспетчер MainView. Если есть представление, используйте его диспетчер.