2011-05-20 11 views
18

Estoy tratando de hacer que mi UI sea más receptiva en mi aplicación WPF. Me generar un nuevo subproceso utilizandoActualizar etiqueta de UI al usar Task.Factory.StartNew

Task.Factory.StartNew(() => RecurseAndDeleteStart()); 

En ese método RecurseAndDeleteStart() Quiero actualizar una etiqueta en la interfaz de usuario con el archivo que se va a eliminar.

¿Cómo se logra esto?

Respuesta

43

Dado que es WPF, puede usar Dispatcher y llamar al Dispatcher.BeginInvoke para coordinar la devolución de llamada a la secuencia de la interfaz de usuario para actualizar la etiqueta.

Alternativamente, se puede pasar un TaskScheduler en su método, y lo utilizan para actualizar la etiqueta de la siguiente manera:

// This line needs to happen on the UI thread... 
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

Task.Factory.StartNew(() => RecurseAndDeleteStart(uiScheduler)); 

Luego, dentro de su método, cuando se desea actualizar una etiqueta, se puede hacer:

Task.Factory.StartNew(() => 
    { 
     theLabel.Text = "Foo"; 
    }, CancellationToken.None, TaskCreationOptions.None, uiScheduler); 

Esto devolverá la llamada al contexto de sincronización de la rosca de la interfaz de usuario.

+1

¡Perfecto! Exactamente lo que estaba buscando. – Demetri

+1

+1 para mostrar que una tarea secundaria se puede ejecutar en un programador diferente (y otro +1 para mostrarme 'CancellationToken.None' - He estado pasando' nuevo CancelaciónToken() 'pero me pareció un hack!) – axeman

+0

funcionando great ty – MonsterMMORPG

2

Debe utilizar label.Dispatcher.BeginInvoke(delegate) para invocar cualquier cosa de un hilo diferente que cambie el contenido de la etiqueta.

Cuestiones relacionadas