¿Existe una forma 'estándar' de especificar que una continuación de la tarea debe ejecutarse en el hilo desde el que se creó la tarea inicial?
Actualmente tengo el siguiente código: funciona, pero hacer un seguimiento del despachador y crear una segunda acción parece una sobrecarga innecesaria.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Control.Invoke(Action)
, es decir.TextBlock1.Invoke
en lugar dedispatcher.Invoke
Respuestas:
Llame a la continuación con
TaskScheduler.FromCurrentSynchronizationContext()
:Esto es adecuado solo si el contexto de ejecución actual está en el hilo de la interfaz de usuario.
fuente
await
es un buen patrón, pero solo si está dentro de unasync
contexto (como un método declaradoasync
). Si no, aún es necesario hacer algo como esta respuesta.Con async solo haces:
Sin embargo:
fuente
false
versión me confunde. Pensé quefalse
significa que podría continuar en un hilo diferente .async
método (que es necesario usarawait
). ¿Cuál es la respuesta cuandoawait
no está disponible?Si tiene un valor de retorno que necesita enviar a la interfaz de usuario, puede usar la versión genérica como esta:
Esto se llama desde un MVVM ViewModel en mi caso.
fuente
Solo quería agregar esta versión porque es un hilo muy útil y creo que es una implementación muy simple. Lo he usado varias veces en varios tipos de aplicaciones multiproceso:
fuente
TaskScheduler
es parte de BCL,Dispatcher
no lo es) y se puede usar para componer cadenas complejas de tareas debido a que no tiene que preocuparse por las operaciones asíncronas de disparar y olvidar (comoBeginInvoke
).Llegué a través de google porque estaba buscando una buena manera de hacer cosas en el hilo de la interfaz de usuario después de estar dentro de una llamada de Task.Run: usando el siguiente código que puede usar
await
para volver al hilo de la interfaz de usuario nuevamente.Espero que esto ayude a alguien.
Uso:
fuente
static
la claseUI
.