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