¿Cómo puedo ejecutar el código en la secuencia de la interfaz de usuario en WinRT (Windows 8 Metro)?Ejecutar el código en el subproceso de interfaz de usuario en WinRT
El método Invoke
no existe.
¿Cómo puedo ejecutar el código en la secuencia de la interfaz de usuario en WinRT (Windows 8 Metro)?Ejecutar el código en el subproceso de interfaz de usuario en WinRT
El método Invoke
no existe.
Uso:
Desde el hilo de interfaz de usuario, ejecute:
var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
Desde el fondo (rosca no UI)
dispatcher.RunAsync(DispatcherPriority.Normal,
<lambda for your code which should run on the UI thread>);
que debe funcionar en ambos PC y posterior generaciones.
¿Hay alguna manera de obtener el despachador en un subproceso que no sea UI? Actualmente obtengo nulo de CoreWindow.GetForCurrentThread() – Grigory
No. Los despachadores están vinculados a un hilo de UI, por lo que debe recuperar el despachador en el hilo de la interfaz de usuario.Una vez que el operador ha sido recuperado, puede recordarlo. Si está en una aplicación XAML, la mayoría de los objetos UI tienen un miembro despachador que puede usar. –
¿Qué partes de mi aplicación se están ejecutando en UI Thread? Estoy usando FrameWorkView (Windows :: ApplicationModel :: Core :: IFrameworkView), y no puedo usar el distribuidor que adquirí del método Run(). Obtengo WrongThreadException cuando intento crear MediaElement a través de RunAsync. – Habba
Uso:
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => Frame.Navigate(typeof(Welcome), this));
Funciona para mí.
Esto no en realidad no garantiza ejecutarlo en el hilo de UI. Solo lo hará si "este" es un objeto en el contexto de la interfaz de usuario. – Luke
Esta es una forma mucho más fácil en mi opinión.
Obtenga el TaskScheduler asociado con la interfaz de usuario.
var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();
A continuación, inicie una Tarea nueva y en el UISyncContext anterior.
Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);
es más fácil de obtener directamente la CoreWindow de la rosca no interfaz de usuario. El siguiente código funcionará en todas partes, incluso cuando GetForCurrentThread()
o Window.Current
devuelve nulo.
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!
});
Tendrá que hacer referencia a Windows.ApplicationModel.Core
espacio de nombres:
using Windows.ApplicationModel.Core;
Obtengo System.NotImplementedException cuando uso esto. Accedo desde el hilo de UI. – Naren
Nunca tuve esta excepción aquí. Podría ser de otro lugar, como dentro de las instrucciones de tu bloque. –
Recibo esta excepción cuando intento acceder al Dispatcher. No he ejecutado ningún código con el despachador. – Naren
DispatcherTimer es también una opción.
lo utilicé para el código que debe ejecutarse en Xaml-diseñador (CoreWindow.Dispatcher, ... no están disponibles en UWP-diseñador)
var localTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(0)
};
localTimer.Tick += (timer, e) =>
{
(timer as DispatcherTimer).Stop();
action();
};
localTimer.Start();
responsabilidad:
deben tener en cuenta que esto debería ser una opción de último recurso si todos los demás fallan.
En UWP, estaba teniendo problemas al intentar establecer la propiedad Source del control CaptureElement (definido en XAML), se quejaba de estar preparado en un hilo diferente, aunque intentaba configurarlo desde un código que era invocado a través de un controlador de eventos Page_Loaded. Terminé usando esto para evitarlo:
previewControl.Dispatcher.TryRunAsync(CoreDispatcherPriority.Normal,() => {
previewControl.Source = _mediaCapture;
}).GetAwaiter().GetResult();
Nota para lectores futuros: recuerde que si su aplicación tiene varias ventanas, hay varios subprocesadores y despachadores de UI. –