当某些任务可以为空时如何处理?

时间:2018-06-11 14:44:50

标签: c# async-await task-parallel-library

我想等待所有任务,但其中一些可能是null。这是一个代码:

Task<MyType1> myTask1 = getData01Async();
Task<MyTyp2> myTask2 = null;
Task<MyType3> myTask3 = null;

if(myVariable == true)
{
    myTask2 = getData02Async();
}
else
{
    myTask3 = getData03Async();
}


wait Task.WhenAll(myTask1, myTask2, myTask3);

这个想法是,task1始终存在,但task2和task3依赖于变量。所以我想并行运行所有任务,等待所有任务完成。如果一个任务为空,则将其视为已完成。

此代码的问题是我在运行时得到一个空引用异常。

有一些方法可以做到这一点?或者我可以使用其他替代方案?

4 个答案:

答案 0 :(得分:5)

使用集合来跟踪不是null的任务。然后将该列表传递给Task.WhenAll方法,如下所示:

var tasks = new List<Task>();

Task<MyType1> myTask1 = getData01Async();
tasks.Add(myTask1);

Task<MyTyp2> myTask2 = null;
Task<MyType3> myTask3 = null;

if(myVariable == true)
{
    myTask2 = getData02Async();
    tasks.Add(myTask2);
}
else
{
    myTask3 = getData03Async();
    tasks.Add(myTask3);
}

await Task.WhenAll(tasks);

答案 1 :(得分:4)

只需过滤掉空任务:

await Task.WhenAll(new Task[] { task1, task2, task3 }.Where(i => i != null));

答案 2 :(得分:2)

根据您的情况,您可以分配已完成的任务或将其放入数组/列表并将其传递给WhenAll

Task<MyType1> myTask1 = getData01Async();
Task<MyType2> myTask2 = Task.FromResult((MyType2) null);
Task<MyType3> myTask3 = Task.FromResult((MyType3) null);

...

wait Task.WhenAll(myTask1, myTask2, myTask3);

答案 3 :(得分:2)

要构建@UweKeim建议的内容,为什么不在将任务传递给WhenAll时简单地过滤掉空任务。

public async Task FilterNullTasks()
{
    Task<string> myTask1 = Task.Delay(1000).ContinueWith(tsk => string.Empty);
    Task<int> myTask2 = null;
    Task<bool> myTask3 = null;

    await Task.WhenAll(new Task[]
    {
        myTask1, myTask2, myTask3
    }.Where(tsk => tsk != null));
}