J'essaie de faire quelque chose comme ça:
foreach (var o in ObjectList)
{
CalculateIfNeedToMakeTaskForO(o);
if (yes)
TaskList.Add(OTaskAsync());
}
Maintenant, je voudrais attendre que toutes ces tâches soient terminées. En plus de faire
foreach(var o in ObjectList)
{
Result.Add("result for O is: "+await OTaskAsync());
}
Puis-je faire quelque chose? (mieux, plus élégant, plus "correct")
Tu recherches Task.WaitAll
(en supposant que votre TaskList
implémente IEnumerable<Task>
)
Task.WaitAll(TaskList.ToArray());
Edit: Puisque WaitAll
ne prend qu'un tableau de tâches (ou une liste de Task
sous la forme d'une variable tableau d'arguments), vous devez convertir votre Enumerable. Si vous voulez une méthode d'extension, vous pouvez faire quelque chose comme ceci:
pulic static void WaitAll(this IEnumerable<Task> tasks)
{
Task.WaitAll(tasks.ToArray());
}
TaskList.WaitAll();
Mais ce n'est vraiment que du sucre syntaxique.
Tu recherches Task.WhenAll
:
var tasks = ObjectList
.Where(o => CalculateIfNeedToMakeTaskForO(o))
.Select(o => OTaskAsync(o))
.ToArray();
var results = await Task.WhenAll(tasks);
var combinedResults = results.Select(r => "result for O is: " + r);