Esperando a que una sola tarea falle de una Lista <Tarea <.. >> de manera más limpia, posiblemente con LINQ?
En mi solicitud tengo unList<Task<Boolean>>
que yoTask.Wait[..]
para determinar si se completaron con éxito (Result = true
) Aunque si durante mi espera unTask
completa y devuelve un valor de falsey Quiero cancelar todos los demásTask
Estoy esperando y hago algo basado en esto.
He creado dos métodos "feos" para hacer esto
// Create a CancellationToken and List<Task<..>> to work with
CancellationToken myCToken = new CancellationToken();
List<Task<Boolean>> myTaskList = new List<Task<Boolean>>();
//-- Method 1 --
// Wait for one of the Tasks to complete and get its result
Boolean finishedTaskResult = myTaskList[Task.WaitAny(myTaskList.ToArray(), myCToken)].Result;
// Continue waiting for Tasks to complete until there are none left or one returns false
while (myTaskList.Count > 0 && finishedTaskResult)
{
// Wait for the next Task to complete
finishedTaskResult = myTaskList[Task.WaitAny(myTaskList.ToArray(), myCToken)].Result;
if (!finishedTaskResult) break;
}
// Act on finishTaskResult here
// -- Method 2 --
// Create a label to
WaitForOneCompletion:
int completedTaskIndex = Task.WaitAny(myTaskList.ToArray(), myCToken);
if (myTaskList[completedTaskIndex].Result)
{
myTaskList.RemoveAt(completedTaskIndex);
goto WaitForOneCompletion;
}
else
;// One task has failed to completed, handle appropriately
Me preguntaba si había una forma más limpia de hacer esto, posiblemente con LINQ.