Forma correcta de obtener el CoreDispatcher en una aplicación de la tienda Windows


Estoy creando una aplicación de la Tienda Windows, y tengo un código que debe publicarse en el subproceso de la interfaz de usuario.

Para eso, me gustaría recuperar el CoreDispatcher y usarlo para publicar el código.

Parece que hay algunas maneras de hacerlo:

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

// Second way
Window.Current.Dispatcher;

Me pregunto cuál es la correcta? o si ambos son equivalentes?

Author: lysergic-acid, 2013-05-10

4 answers

Esta es la forma preferida:

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

La ventaja que esto tiene es que obtiene el principal CoreApplicationView y por lo tanto está siempre disponible. Más detalles aquí.

Hay dos alternativas que puedes usar.

Primera alternativa

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

Esto obtiene la vista activa para la aplicación, pero esto le dará null, si no se ha activado ninguna vista. Más detalles aquí.

Segunda alternativa

Window.Current.Dispatcher

Esta solución no funcionará cuando se llama desde otro subproceso, ya que devuelve null en lugar del Despachador de interfaz de usuario . Más detalles aquí.

 127
Author: MAXE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-17 07:08:25

Para cualquiera que use C++ / CX

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal,
    ref new Windows::UI::Core::DispatchedHandler([this]()
{
    // do stuff
}));
 12
Author: Brett Pennings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-02 02:42:46
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
            CoreDispatcherPriority.Normal,
            () => { // your code should be here});
 3
Author: apramc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-08 23:10:54

En realidad, yo propondría algo en la línea de esto:

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

De esa manera, si tiene abierta otra Vista/Ventana, no confundirá a los Despachadores...

Esta pequeña gema comprueba si hay una Ventana. Si no hay ninguno, utilice el despachador de MainView. Si hay una vista, use su despachador.

 0
Author: J. H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 14:01:49