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

时间:2015-02-16 08:28:19

标签: c# .net asynchronous task-parallel-library async-await

我有一种情况,我希望异步激活用户定义的任务数并等待所有任务完成。简化,这就是我正在处理的事情:

[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));但这等待任务,他们不会同时运行。

HandleIntro:

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

1 个答案:

答案 0 :(得分: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);
}