2012-05-14 20 views

Respuesta

68

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.

+5

¿Hay alguna manera de obtener el despachador en un subproceso que no sea UI? Actualmente obtengo nulo de CoreWindow.GetForCurrentThread() – Grigory

+3

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. –

+0

¿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

8

Uso:

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

Funciona para mí.

+3

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

5

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); 
+0

FYI: obtengo una InvalidOperationException "El SynchronizationContext actual no se puede usar como TaskScheduler". – Akku

+0

También recibo una InvalidOperation – LowDev1

+1

Your SynchronizationContext es nulo. Es por eso que estás recibiendo esa excepción. No hay nada malo con mi código – Deeb

75

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; 
+0

Obtengo System.NotImplementedException cuando uso esto. Accedo desde el hilo de UI. – Naren

+0

Nunca tuve esta excepción aquí. Podría ser de otro lugar, como dentro de las instrucciones de tu bloque. –

+0

Recibo esta excepción cuando intento acceder al Dispatcher. No he ejecutado ningún código con el despachador. – Naren

0

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.

0

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(); 
Cuestiones relacionadas