Saltar al contenido

Async Task.WhenAll con tiempo de espera

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 .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *