web-dev-qa-db-ja.com

タスクのリストを待つ

私はこのようなことをしようとしています:

foreach (var o in ObjectList) 
{ 
    CalculateIfNeedToMakeTaskForO(o);

    if (yes) 
        TaskList.Add(OTaskAsync());
}

ここで、これらすべてのタスクが完了するまで待ちたいと思います。する以外に

foreach(var o in ObjectList)
{
    Result.Add("result for O is: "+await OTaskAsync());
}

私にできることはありますか? (より良い、よりエレガントな、より「正しい」)

27
ctlaltdefeat

あなたは探している - Task.WaitAllTaskListが実装されていると仮定するとIEnumerable<Task>

Task.WaitAll(TaskList.ToArray());

Edit:WaitAllはタスクの配列(または変数の形式のTaskのリストのみを受け取るため)引数配列)、Enumerableを変換する必要があります。拡張メソッドが必要な場合は、次のようなことができます。

pulic static void WaitAll(this IEnumerable<Task> tasks) 
{
    Task.WaitAll(tasks.ToArray());
}

TaskList.WaitAll();

しかし、それは本当に唯一の構文糖です。

31
Simon Belanger

あなたは探している 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