Modo corretto per ottenere CoreDispatcher in un’app di Windows Store

Sto creando un’app di Windows Store e ho un codice che deve essere pubblicato nel thread dell’interfaccia utente.

Per questo, mi piacerebbe recuperare il CoreDispatcher e usarlo per pubblicare il codice.

Sembra che ci siano alcuni modi per farlo:

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

Mi chiedo quale sia corretta? o se entrambi sono equivalenti?

Questo è il modo preferito:

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

Il vantaggio è che ottiene il principale CoreApplicationView e quindi è sempre disponibile. Maggiori dettagli qui .

Ci sono due alternative che potresti usare.

Prima alternativa

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

Questo ottiene la vista triggers per l’app, ma questo ti darà zero , se nessuna vista è stata triggersta. Maggiori dettagli qui .

Seconda alternativa

 Window.Current.Dispatcher 

Questa soluzione non funzionerà quando viene chiamata da un altro thread, in quanto restituisce null anziché UI Dispatcher . Maggiori dettagli qui .

Per chiunque usi 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}); 

In realtà, vorrei proporre qualcosa nella linea di questo:

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

In questo modo, se hai aperto un altro View / Window, non avrai confuso i Dispatcher …

Questa piccola gem controlla se c’è anche una finestra. Se nessuno, utilizzare il Dispatcher di MainView. Se c’è una vista, usa il tuo Dispatcher.