Как делать, когда все задачи могут быть нулевыми? - PullRequest
0 голосов
/ 11 июня 2018

Я бы хотел подождать всю задачу, но некоторые из них могут быть нулевыми.Это такой код:

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 зависят от переменной.Поэтому я хотел бы выполнить все задачи параллельно и ждать, когда все они будут завершены.И если одна задача равна нулю, обработайте ее как выполненную.

Проблема с этим кодом заключается в том, что я получаю исключение нулевой ссылки при запуске.

Есть некоторый способ сделатьтот?Или какие еще альтернативы я мог бы использовать?

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

Просто отфильтруйте пустые задачи:

await Task.WhenAll(new Task[] { task1, task2, task3 }.Where(i => i != null));
0 голосов
/ 11 июня 2018

Ну, в зависимости от вашего сценария, вы можете назначить задачу выполнено или поместить их в массив / список и передать ее в 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);
0 голосов
/ 11 июня 2018

Чтобы основываться на том, что предложил @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));
}
0 голосов
/ 11 июня 2018

Используйте коллекцию для отслеживания задач, которые не 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);
...