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

C# 异步启动多个任务并等待它们完成,c#,.net,asynchronous,task-parallel-library,async-await,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 t

在这种情况下,我希望异步启动用户定义数量的任务,并等待所有任务完成。简而言之,我要处理的是:

[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--;
        }
 }
对于某些上下文,这些是SeleniumWebDrivers,正在加速运行一些UI测试。我看到浏览器弹出,但一旦最后一个
Task.Run()
完成,所有执行都停止。在停止执行之前,如何启动
n
驱动程序以异步运行,同时等待它们全部完成

我尝试了
wait Task.Run(()=>HandleIntro(proxyDriver,target))但这将等待任务,并且它们不会同时运行

HandleIntro:

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

使用
异步等待
相当简单。您的任务本身返回一个可等待的,可以异步等待所有任务完成:

[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);
}
[TestMethod]
公共异步任务启动()
{
var numDrivers=2;
列表任务=新列表();
while(numDrivers!=0)
{
var rnd=新随机数();
var r=rnd.Next(itemArray.Count);
var target=itemArray[r];
var proxyDriver=GetProxiedDriver();
tasks.Add(Task.Run(()=>HandleIntro(proxyDriver,target));
numDrivers--;
}
等待任务。何时(任务);
}

您可以在
任务
数组上使用
Task.WhenAll
,并
等待它。查看
Task.WaitAll()
/
WhenAll()
。隐马尔可夫模型。。。执行也会立即停止,当第一个测试启动时,测试就会通过,并且在
HandleIntro
中抛出异常?打开CLR异常并查看。我是一个哑巴,输入了错误的内容。非常感谢:)