web-dev-qa-db-fra.com

Attendre la liste des tâches

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")

27
ctlaltdefeat

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.

31
Simon Belanger

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);
86
Stephen Cleary