同时异步启动多个任务并等待它们完成

7

我有一个场景,需要异步地启动用户定义数量的任务,并等待它们全部完成。简单来说,我的需求如下:

[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 Webdriver,用于运行一些UI测试。我看到浏览器弹出,但是一旦最后一个Task.Run()完成,所有执行都会停止。如何在等待它们全部完成之前异步启动n个驱动程序来停止执行?
我已经尝试了await Task.Run(() => HandleIntro(proxyDriver, target));,但这等待任务,它们不会同时运行。 HandleIntro:
private async Task HandleIntro(FirefoxDriver driver, string target) {
    // do stuff
}

你可以在一个 Task 数组上使用 Task.WhenAll,然后使用 await - Luaan
请查看Task.WaitAll()/WhenAll()。https://msdn.microsoft.com/zh-cn/library/dd270695(v=vs.110).aspx - Jeroen Vannevel
1个回答

7

使用async-await非常简单。你可以使用Task.WhenAll,它本身返回一个可等待对象,可以异步等待所有任务完成:

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

哦...这个也会立即停止执行,只要第一个启动就通过测试了。 - SB2055
也许在 HandleIntro 函数内部抛出了异常?开启 CLR 异常并查看。 - Yuval Itzchakov
1
我是个笨蛋,打错了一些字。非常感谢 :) - SB2055

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接