.net - subprocesos - Ejecutar código en el subproceso de interfaz de usuario en WinRT
manipular controles desde otro formulario c# (6)
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();
¿Cómo puedo ejecutar el código en la secuencia de la interfaz de usuario 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,
<lambda for your code which should run on the UI thread>);
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;
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);
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,
<lambda for your code which should run on the UI thread>);
Eso debería funcionar tanto en CP como en compilaciones posteriores.
Utilizar:
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));
Esto funciona para mi.
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.