等待任务数量可能不同的任务

Waiting on tasks where number of tasks could vary

我需要等待一项或多项任务完成。我需要等待的任务数取决于一些条件。所以我的代码如下所示。

Task[] tasks = new Task[2];

if (condition1 == true)
{
    tasks[0] = Task.Factory.StartNew(() => MyMethod1());
}

if (condition2 == true)
{
    tasks[1] = Task.Factory.StartNew(() => MyMethod2());
}

Task.WaitAll(tasks);

假设 condition2 为假,因此任务数组中只有一项。在这种情况下 WaitAll 只会等待 tasks[0] 吗?

如果 tasks 数组的任何元素为 null,两者 Task.WaitAll and Task.WhenAll 都会抛出 ArgumentException。

为避免异常,您可以将任务添加到 List<Task>

List<Task> tasks = new List<Task>();

if (condition1)
{
    tasks.Add(Task.Factory.StartNew(() => MyMethod1()));
}

if (condition2)
{
    tasks.Add(Task.Factory.StartNew(() => MyMethod2()));
}

Task.WaitAll(tasks.ToArray());

最好使用支持IEnumerable的WhenAll作为参数。这允许您使用与数组不同的容器,并将首先避免异常。

List<Task> tasks= new List<Task>();

if (condition1)
{
    tasks.Add(Task.Factory.StartNew(() => MyMethod1()));
}

if (condition2)
{ 
    tasks.Add(Task.Factory.StartNew(() => MyMethod2()));
}

await Task.WhenAll(tasks);

另见 WaitAll vs WhenAll