Tengo una aplicación con varios Dispatcher
s (también conocidos como subprocesos GUI, también conocidos como bombas de mensajes) para asegurar que una parte lenta y sin respuesta de la GUI se ejecute sin afectando demasiado al resto de la aplicación. También utilizo mucho Task
.
Actualmente tengo un código que ejecuta condicionalmente una Action
en un TaskScheduler
o un Dispatcher
y luego devuelve una Task
ya sea directamente o creando una manualmente usando TaskCompletionSource
. Sin embargo, este diseño de personalidad dividida hace que lidiar con cancelaciones, excepciones, etc. sea mucho más complicado de lo que me gustaría. Quiero usar Task
s en todas partes y DispatcherOperation
s en ninguna parte. Para hacer eso, necesito programar tareas en los despachadores, pero ¿cómo?
¿Cómo puedo obtener un TaskScheduler
para cualquier Dispatcher
dado?
Editar: Después de la discusión a continuación, me decidí por la siguiente implementación:
public static Task<TaskScheduler> GetScheduler(Dispatcher d) {
var schedulerResult = new TaskCompletionSource<TaskScheduler>();
d.BeginInvoke(() =>
schedulerResult.SetResult(
TaskScheduler.FromCurrentSynchronizationContext()));
return schedulerResult.Task;
}