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

时间:2015-06-20 19:22:33

标签: c# .net-4.0 task

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

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为false,因此tasks数组中只有一个项目。在这种情况下,WaitAll只会等待tasks[0]吗?

2 个答案:

答案 0 :(得分:2)

如果tasks数组的任何元素为null,则Task.WaitAllTask.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());

答案 1 :(得分:0)

最好使用支持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