异步触发多个任务并等待它们完成

Firing off multiple Tasks asynchronously and waiting for them to complete

我有一种情况,我想异步触发用户定义数量的任务并等待所有任务完成。简化了,这就是我要处理的内容:

[TestMethod]
public async Task Start() {
        var numDrivers = 2;
        while (numDrivers != 0) {
            var rnd = new Random();
            var r = rnd.Next(itemArray.Count);
            var target = itemArray[r];
            var proxyDriver = GetProxiedDriver();
            Task.Run(() => HandleIntro(proxyDriver, target));
            numDrivers--;
        }
 }

对于某些上下文 - 这些是 Selenium webdrivers 正在加速 运行 一些 UI 测试。我看到浏览器弹出,但一旦最后一个 Task.Run() 完成,所有执行都会停止。如何在停止执行之前等待所有驱动程序完成时异步触发 n 到 运行 的驱动程序?

我试过 await Task.Run(() => HandleIntro(proxyDriver, target)); 但这等待任务,他们不会同时 运行。

手柄简介:

private async Task HandleIntro(FirefoxDriver driver, string target) {
    // do stuff
}

使用 async-await 相当简单。您有 Task.WhenAll 本身 returns 一个可以异步等待所有任务完成的可等待对象:

[TestMethod]
public async Task Start() 
{
   var numDrivers = 2;
   List<Task> tasks = new List<Task>();

   while (numDrivers != 0) 
   {
       var rnd = new Random();
       var r = rnd.Next(itemArray.Count);

       var target = itemArray[r];
       var proxyDriver = GetProxiedDriver();

       tasks.Add(Task.Run(() => HandleIntro(proxyDriver, target)));
       numDrivers--;
   }

   await Task.WhenAll(tasks);
}