代码之家  ›  专栏  ›  技术社区  ›  m1nkeh

多个异步任务

  •  0
  • m1nkeh  · 技术社区  · 6 年前

    我有两个异步mehotd,它们彼此之间没有直接关系(它们都写出来了)。。我不想任何一个阻碍另一个的效率。。

    如果我将其中一个活动放在一组任务中,如下所示:

    var list = new List<Task>();
    
    foreach (var t in things)
    {
        list.Add(My.MethodAsync(t)); // method returns Task
    }
    
    await Task.WhenAll(t);
    

    var list = new List<Task>();
    
    foreach (var t in things)
    {
        list.Add(My.MethodAsync(t)); // method returns Task
    }
    
    foreach (var t in things)
    {
        await My.OtherAsync(t)); // method returns Task
    }
    
    await Task.WhenAll(t);
    

    Task.WhenAll()需要等待第二个foreach完成。。。

    var allTasks = new List<Task>();
    
    foreach (var t in things)
    {
        allTasks.Add(My.MethodAsync(t)); // method returns Task
        allTasks.Add(My.OtherAsync(t)); // method returns Task
    }
    
    await Task.WhenAll(t);
    

    把它打出来后,即使任务本身是独立的,如果两个任务都不输出,那么如果出现错误就更好了。。隐马尔可夫模型

    问题仍然存在;)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Woody1193 Nimmi Rashinika    6 年前
    var allTasks = new List<Task>();
    
    foreach (var t in things)
    {
        allTasks.Add(My.MethodAsync(t); // method returns Task
        allTasks.Add(My.OtherAsync(t); // method returns Task
    }
    
    await Task.WhenAll(t).ConfigureAwait(false);
    

    这就行了。正如在注释中指出的,如果您的方法返回 Task 已经开始了(参见 here ),然后全部 Task.WhenAll 我们要做的就是异步等待任务完成。如果这些任务的运行时间足够长,您可以在前一个任务完成之前启动它们,则它们可以并行运行。注意,我添加了 ConfigureAwait(false) await