当某些任务可以为空时,如何WhensAll?

Álv*_*cía 3 c# task-parallel-library async-await

我想等待所有任务,但是其中一些可以为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);
Run Code Online (Sandbox Code Playgroud)

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

这段代码的问题是我在运行时得到了空引用异常。

有一些方法可以做到吗?还是我可以使用其他替代方法?

Fab*_*jan 6

好吧,根据您的方案,您可以分配一个完成的任务,或者将它们放在数组/列表中,然后将其传递给WhenAll

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

...

await Task.WhenAll(myTask1, myTask2, myTask3);
Run Code Online (Sandbox Code Playgroud)


Cod*_*und 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);
Run Code Online (Sandbox Code Playgroud)


arm*_*enm 5

只需过滤掉空任务:

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