69

Sto costruendo un'app di Windows Store e ho un codice che deve essere pubblicato nel thread dell'interfaccia utente.Modo corretto per ottenere il CoreDispatcher in un'app di Windows Store

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

Sembra che ci sono alcuni modi per farlo:

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

// Second way 
Window.Current.Dispatcher; 

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

+2

Entrambi sono * tipo * di corretto, ma saranno nulli se non si sta accedendo da qualcosa che * ha * già accesso al Dispatcher. Se si desidera utilizzarlo, ad esempio, in ViewModel o Controller, è necessario memorizzare il Dispatcher, generalmente come proprietà statica nel proprio controller App.xaml.cs o IOC e impostarlo dalla prima pagina che hai caricato. –

risposta

113

Questo è il modo preferito:

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

Il vantaggio questo ha è che ottiene il principale CoreApplicationView e quindi è sempre disponibile. Maggiori dettagli here.

Esistono due alternative che è possibile utilizzare.

prima alternativa

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

Questo diventa la vista attiva per l'applicazione, ma questo vi darà nulla, se è stata attivata senza vista. Maggiori dettagli here.

seconda alternativa

Window.Current.Dispatcher 

Questa soluzione non funziona quando viene chiamata da un altro filo in restituisce nullo invece del UI Dispatcher. Maggiori dettagli here.

+0

Ho provato questo, ma quando rintraccio il codice, il codice delegato è ancora in esecuzione su un thread di lavoro e non il "Main Thread". –

+3

Si noti che (almeno in Windows 8.1) DispatcherPriority è ora CoreDispatcherPriority – Illidan

+0

Conciso! Tipica eleganza Microsoft. – devios1

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

per chiunque utilizzi C++/CX

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

Questo è C++/CX, non C++. La distinzione è rilevante, poiché esiste anche una proiezione C++ standard per Windows Runtime: [C++/WinRT] (https://github.com/Microsoft/cppwinrt). – IInspectable

+0

Buon punto - aggiornato! –

0

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 avete dovete aprire un'altra View/Finestra, non si ottiene confuso il Dispatcher ...

Questo la piccola gemma controlla se c'è anche una finestra. Se nessuno, utilizzare il Dispatcher di MainView. Se c'è una vista, usa il tuo Dispatcher.

Problemi correlati