代码之家  ›  专栏  ›  技术社区  ›  Álvaro García

当某些任务可以为空时如何处理?

  •  3
  • Álvaro García  · 技术社区  · 6 年前

    我想等待所有任务,但其中一些可以为空。它是这样一个代码:

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

    其思想是,任务1总是存在的,但任务2和任务3依赖于一个变量。所以我想并行运行所有的任务,等待所有任务完成。如果一个任务为空,则将其视为已完成。

    这段代码的问题是,当它运行时,我得到一个空引用异常。

    有什么办法吗?或者我可以使用其他什么替代方法?

    4 回复  |  直到 5 年前
        1
  •  5
  •   CodeNotFound dotnetstep    6 年前

    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);
    
        2
  •  4
  •   armenm    6 年前

    只需过滤掉空任务:

    await Task.WhenAll(new Task[] { task1, task2, task3 }.Where(i => i != null));
    
        3
  •  3
  •   Fabjan    5 年前

    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);
    
        4
  •  2
  •   JSteward    6 年前

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