El siguiente código es una simplificación de un código en una aplicación real. El problema a continuación es que se ejecutará un trabajo largo en el hilo de la interfaz de usuario, en lugar de un hilo de fondo.Cómo hacer que una tarea NO se ejecute en el subproceso UI
void Do()
{
Debug.Assert(this.Dispatcher.CheckAccess() == true);
Task.Factory.StartNew(ShortUIWork, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
void ShortUIWork()
{
Debug.Assert(this.Dispatcher.CheckAccess() == true);
Task.Factory.StartNew(LongWork, TaskCreationOptions.LongRunning);
}
void LongWork()
{
Debug.Assert(this.Dispatcher.CheckAccess() == false);
Thread.Sleep(1000);
}
So Do() se llama normalmente del contexto de la interfaz de usuario. Y también lo es ShortUIWork, tal como lo define TaskScheduler. Sin embargo, LongWork termina llamado también en el subproceso de interfaz de usuario, que, por supuesto, bloquea la interfaz de usuario.
¿Cómo asegurar que una tarea no se ejecute en el hilo de la interfaz de usuario?
'tasks' crear unos hilos que * no * se ejecutan en la interfaz de usuario por definición. ¿Estás seguro de que 'LongWork' bloquea el hilo de UI? – Tigran
@Tigran: TPL usa subprocesos de fondo por defecto, no por definición. –
El código que no reproduce el problema no ayuda. Una razón común para un comportamiento como este es una clase contenedora para un componente COM. COM mantiene los objetos de las clases que se anuncian a sí mismos que no admiten ningún tipo de subprocesamiento seguro mediante la clasificación automática de todas las llamadas al subproceso que las creó. –