当某些任务可以为空时如何WhenAll?
How to WhenAll when some tasks can be 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 取决于一个变量。所以我想 运行 并行执行所有任务并等待所有任务完成。如果一项任务为空,则将其视为已完成。
这段代码的问题是当它 运行s.
时我得到一个空引用异常
有什么方法可以做到吗?或者我可以使用其他什么替代方法?
使用集合来跟踪不是 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);
好吧,根据您的情况,您 可以 分配已完成的任务或将它们放在 array/list 中,然后将此列表传递给 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);
根据@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));
}
只需过滤掉空任务:
await Task.WhenAll(new Task[] { task1, task2, task3 }.Where(i => i != 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 取决于一个变量。所以我想 运行 并行执行所有任务并等待所有任务完成。如果一项任务为空,则将其视为已完成。
这段代码的问题是当它 运行s.
时我得到一个空引用异常有什么方法可以做到吗?或者我可以使用其他什么替代方法?
使用集合来跟踪不是 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);
好吧,根据您的情况,您 可以 分配已完成的任务或将它们放在 array/list 中,然后将此列表传递给 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);
根据@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));
}
只需过滤掉空任务:
await Task.WhenAll(new Task[] { task1, task2, task3 }.Where(i => i != null));