Álvaro García
Álvaro García

Reputation: 19396

How to WhenAll when some tasks can be null?

I would like to wait all task, but some of them can be null. It is a code like that:

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);

The idea is, task1 always exists, but task2 and task3 depends of a variable. So I would like to run all the task in parallel and wait when all of them are finished. And if one task is null, the treat it as it is finished.

The problem with this code is that I get a null reference exception when it runs.

There are some way to do that? Or what another alternatives could I use?

Upvotes: 10

Views: 8365

Answers (4)

Fabjan
Fabjan

Reputation: 13676

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);

Upvotes: 11

JSteward
JSteward

Reputation: 7091

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));
}

Upvotes: 3

armenm
armenm

Reputation: 942

Just filter the null tasks out:

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

Upvotes: 17

CodeNotFound
CodeNotFound

Reputation: 23220

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);

Upvotes: 7

Related Questions