2011-01-31 19 views
7

El TPL tiene un número de valores TaskContinuationOptions que controlan en qué circunstancias se ejecuta una tarea. Por ejemplo, TaskContinuationOptions.NotOnCanceled impide que una tarea se ejecute cuando se cancela su padre.¿Por qué el TPL no admite las continuidades multitarea filtradas por el estado?

Sin embargo, ninguno de estos filtros de estado de la tarea se aplica a las continuaciones de tareas múltiples. No se puede hacer algo como:

TaskFactory f = new TaskFactory(); 
Task t1 = new Task (() => Thread.Sleep (5000)); 
Task t2 = new Task (() => Thread.Sleep (4000)); 
Task t3 = f.ContinueWhenAll (new Task[] { t1, t2 }, 
          (tasks) => { ... }, 
          TaskContinuationOptions.OnlyOnRanToCompletion); 

se llega a un error que dice, "It is invalid to exclude specific continuation kinds for continuations off of multiple tasks."

Lo que no entiendo es por qué esta condición sería excluido de la API. ¿Por qué no sería un caso de uso perfectamente válido querer que una tarea se ejecute solo cuando todos los antecedentes terminaron en un estado particular?

Respuesta

0

"... para funcionar sólo cuando todos los antecedentes terminaron en un estado particular ..."

Nota su palabra 'todos', no soy MS, pero apuesto a que tiene que ver con el hecho de que se necesitaría otra enumeración TaskContinuationOptions completa que incluye All, Any, OnlyOne, AllButOne y así sucesivamente.

Por otra parte, Eric Lippert siempre está respondiendo a preguntas como éstas con "que es caro y requiere mucho tiempo para agregar una 'característica simple'. Camino Moreso, que conseguir el derecho básico y dejar que los usuarios apliquen el resto.

0

ContinueWhenAll medios "ejecutar la continuación cuando todas las tareas se hayan completado satisfactoriamente." Especificar NotOn* o OnlyOn* sería contrario o superfluo a esa definición. Consulte la sección de comentarios de this MSDN article.

Cuestiones relacionadas