Ejecutar código en el subproceso de interfaz de usuario en WinRT

¿Cómo puedo ejecutar el código en la secuencia de UI en WinRT (Windows 8 Metro)?

El método Invoke no existe.

Es más fácil obtener directamente CoreWindow del hilo que no es UI. El siguiente código funcionará en todas partes, incluso cuando GetForCurrentThread() o Window.Current devuelve null .

 CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, ); 

por ejemplo:

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

Deberá hacer referencia al espacio de nombres Windows.ApplicationModel.Core :

 using Windows.ApplicationModel.Core; 

Utilizar:

Desde su subproceso de interfaz de usuario, ejecute:

 var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher; 

De su fondo (hilo no UI)

 dispatcher.RunAsync(DispatcherPriority.Normal, ); 

Eso debería funcionar tanto en CP como en comstackciones posteriores.

Utilizar:

 this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this)); 

Esto funciona para mi.

Esta es una forma mucho más fácil en mi opinión.

Obtenga TaskScheduler asociado con la interfaz de usuario.

  var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext(); 

Luego, inicie una nueva Tarea y en el UISyncContext anterior.

  Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext); 

DispatcherTimer también es una opción.

Lo usé para código que debe ejecutarse en Xaml-designer (CoreWindow.Dispatcher, … no están disponibles en UWP-designer)

 var localTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(0) }; localTimer.Tick += (timer, e) => { (timer as DispatcherTimer).Stop(); action(); }; localTimer.Start(); 

Renuncia:
Debo señalar que esta debería ser una opción de último recurso si todos los demás fallan.

En UWP, tenía problemas al intentar establecer la propiedad Source del control CaptureElement (que está definido en XAML), se quejaba de estar preparado en un hilo diferente, aunque intentaba configurarlo desde el código invocado a través de Page_Loaded controlador de eventos. Terminé usando esto para evitarlo:

 previewControl.Dispatcher.TryRunAsync(CoreDispatcherPriority.Normal, () => { previewControl.Source = _mediaCapture; }).GetAwaiter().GetResult();