C# 当某些任务可以为空时,如何进行初始化?

C# 当某些任务可以为空时,如何进行初始化?,c#,async-await,task-parallel-library,C#,Async Await,Task Parallel Library,我想等待所有任务,但其中一些任务可以为空。这是一个这样的代码: Task<MyType1> myTask1 = getData01Async(); Task<MyTyp2> myTask2 = null; Task<MyType3> myTask3 = null; if(myVariable == true) { myTask2 = getData02Async(); } else { myTask3 = getData03Async();

我想等待所有任务,但其中一些任务可以为空。这是一个这样的代码:

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);
Task myTask1=getData01Async();
任务myTask2=null;
任务myTask3=null;
if(myVariable==true)
{
myTask2=getData02Async();
}
其他的
{
myTask3=getData03Async();
}
wait Task.WhenAll(myTask1、myTask2、myTask3);
其思想是,task1始终存在,但task2和task3依赖于一个变量。因此,我希望并行运行所有任务,并等待所有任务完成。如果一个任务为空,则将其视为已完成

这段代码的问题是,当它运行时,我得到一个空引用异常


有办法吗?或者我还可以使用什么替代方法?

使用集合来跟踪非
null
的任务。然后将该列表传递给
任务。所有
方法如下:

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);
var tasks=newlist();
任务myTask1=getData01Async();
任务。添加(myTask1);
任务myTask2=null;
任务myTask3=null;
if(myVariable==true)
{
myTask2=getData02Async();
任务。添加(myTask2);
}
其他的
{
myTask3=getData03Async();
任务。添加(myTask3);
}
等待任务。何时(任务);

好吧,根据您的场景,您可以分配已完成的任务或将它们放入数组/列表中,然后将此列表传递给
,然后所有

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

...

await Task.WhenAll(myTask1, myTask2, myTask3);
Task myTask1=getData01Async();
Task myTask2=Task.FromResult((MyType2)null);
Task myTask3=Task.FromResult((MyType3)null);
...
等待任务。WhenAll(myTask1、myTask2、myTask3);

要建立在@UweKeim建议的基础上,为什么不在将空任务传递给
whalll
时将其过滤掉呢

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));
}
public异步任务FilterNullTasks()
{
Task myTask1=Task.Delay(1000).ContinueWith(tsk=>string.Empty);
任务myTask2=null;
任务myTask3=null;
等待任务。WhenAll(新任务[]
{
myTask1、myTask2、myTask3
}。其中(tsk=>tsk!=null));
}

只需过滤掉空任务:

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

将任务放入显式集合并使用
myTasks.Where(t=>t!=null)
传递到
Task.whalll
?myTask1??任务CompletedTask@ErnodeWeerd
Task.CompletedTask
无法返回result@Fabjanmeh,因为它们在
任务
的意义上都是不同的
T
,这没关系-这是
参数任务[]
重载和
任务。CompletedTask
绝对是
任务
@UweKeim,这正是我所想的,我能做出一个好的答案。这是不是意味着与我给出的答案不同?@JSteward我没有看你的答案(我的目的是让它简短,所以我没有挖掘长的答案),但是的-它是一样的。公平的说,只是要问一下Hanks,这真的帮了我大忙。我有多个不同结果类型的任务,我不确定这些任务是否应该触发。使用此解决方案,我仍然可以处理结果,而不必担心在将所有内容添加到列表时泛型任务返回的类型!唯一不明显的建议。谢谢这是最好的解决办法。只需执行myTask=x!=无效的MyAsync():Task.CompletedResult,而不是创建数组并对其进行筛选。