Hola, encontramos la respuesta a tu pregunta, desplázate y la encontrarás a continuación.
Solución:
Podrías combinar el resultado Task
con un Task.Delay()
utilizando Task.WhenAny()
:
await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(timeout));
Si desea recolectar tareas completadas en caso de un tiempo de espera:
var completedResults =
tasks
.Where(t => t.Status == TaskStatus.RanToCompletion)
.Select(t => t.Result)
.ToList();
Creo que una opción más clara y robusta que también hace bien el manejo de excepciones sería usar Task.WhenAny
en cada tarea junto con una tarea de tiempo de espera, revise todas las tareas completadas y filtre las de tiempo de espera, y use await Task.WhenAll()
en lugar de Task.Result
para recoger todos los resultados.
Aquí hay una solución de trabajo completa:
static async Task WhenAll(IEnumerable> tasks, TimeSpan timeout)
var timeoutTask = Task.Delay(timeout).ContinueWith(_ => default(TResult));
var completedTasks =
(await Task.WhenAll(tasks.Select(task => Task.WhenAny(task, timeoutTask)))).
Where(task => task != timeoutTask);
return await Task.WhenAll(completedTasks);
Consulte las secciones “Early Bailout” y “Task.Delay” de Consuming the Task-based Asynchronous Pattern de Microsoft.
rescate anticipado. Una operación representada por t1 se puede agrupar en un WhenAny con otra tarea t2, y podemos esperar en la tarea WhenAny. t2 podría representar un tiempo de espera, una cancelación o alguna otra señal que hará que la tarea WhenAny se complete antes de que se complete t1.
Valoraciones y reseñas
Acuérdate de que te brindamos la opción de agregar una reseña .