Creo que vi un error grave en TPL. No estoy seguro. Pasé mucho tiempo rascándome la cabeza y no puedo entender el comportamiento. ¿Alguien puede ayudar?Error en TPL - TaskContinuationOptions.ExecuteSynchronously?
Lo que mi escenario es:
- creo una tarea que hace cosa simple. Sin excepciones, etc.
- Registre una continuación con ExecuteSynchronously set. Debe estar en el mismo hilo.
- Comienzo la tarea en el taskcheduler predeterminado (ThreadPool). El hilo de inicio continúa y lo espera.
- Comienza la tarea. Pases.
- La continuación comienza en el mismo subproceso que la tarea (completando la tarea anterior) y entra en un bucle infinito.
- No ocurre nada con el hilo de espera. No quiere ir más allá. Atascado en espera. Revisé el depurador, la tarea es RunToCompletion.
Aquí está mi código. Apreciar cualquier ayuda!
// note: using new Task() and then Start() to avoid race condition dangerous
// with TaskContinuationOptions.ExecuteSynchronously flag set on continuation.
var task = new Task(() => { /* just return */ });
task.ContinueWith(
_task => { while (true) { } /* never return */ },
TaskContinuationOptions.ExecuteSynchronously);
task.Start(TaskScheduler.Default);
task.Wait(); // a thread hangs here forever even when EnterEndlessLoop is already called.
También creo que esto es un error. Aquí está la página de documentación: http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions.aspx Desafortunadamente, no dice nada sobre este caso. – usr
¿Hay alguna posibilidad de que pueda expandir el fragmento de código para que sea lo suficientemente completo como para que otros copien y peguen y se ejecuten solos? –
@usr - dice "Solo las ejecuciones de ejecución muy corta deben ejecutarse sincrónicamente". :) Estoy de acuerdo en que es un error, sin embargo. –