whenfirst whenany whenall tasks run possible multiple example async and c# async-await task-parallel-library

whenany - task.whenall example c#



Task.WhenAny-¿Qué sucede con las tareas restantes en ejecución? (1)

Tengo el siguiente código:

List<Task<bool>> tasks = tasksQuery.ToList(); while (tasks.Any()) { Task<bool> completedTask = await Task.WhenAny(tasks); if (await completedTask) return true; tasks.Remove(completedTask); }

Lanza tareas en paralelo. Cuando la primera tarea completada devuelve verdadero, los métodos devuelven verdadero.

Mi pregunta es:

¿Qué sucede con todas las tareas restantes que se han iniciado y que probablemente aún se ejecutan en segundo plano? ¿Es este el enfoque correcto para ejecutar un código que es asíncrono, paralelo y debería regresar después de que ocurra la primera condición o es mejor lanzarlos uno por uno y esperar singularmente?

Gracias


Por cierto, estoy leyendo Concurrency in C # CookBook , de Stephen Cleary , y puedo referirme a algunas partes del libro aquí, supongo.

De la Receta 2.5 - Discusión , tenemos

Cuando se complete la primera tarea, considere si cancelar las tareas restantes. Si las otras tareas no se cancelan pero tampoco se esperan, entonces se abandonan. Las tareas abandonadas se ejecutarán hasta su finalización y sus resultados se ignorarán . Cualquier excepción de esas tareas abandonadas también será ignorada.

Otro antipattern para Task.WhenAny está manejando las tareas a medida que se completan. Al principio, parece un enfoque razonable para mantener una lista de tareas y eliminar cada tarea de la lista a medida que se completa . El problema con este enfoque es que se ejecuta en tiempo O (N ^ 2), cuando existe un algoritmo O (N).

Además de eso, creo que cuando WhenAny sea ​​el enfoque correcto, solo considere seguir el enfoque de Leonid de pasar el mismo CancellationToken a cada tarea y cancelarlas después de que regrese la primera. Y aun así, solo en caso de que el costo de estas operaciones esté realmente gravando el sistema.