How to WhenAll when some tasks can be null?
Well, depending on your scenario you could assign completed tasks or put them in an array/list and then pass this list to 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);
To build on what @UweKeim suggested, why not simply filter out the null tasks when you pass them to the 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));
}
Just filter the null tasks out:
await Task.WhenAll(new Task[] { task1, task2, task3 }.Where(i => i != null));
Use a collection to track the tasks that aren't null
. Then pass that list to Task.WhenAll
method like below:
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);