我有一种情况,我希望异步激活用户定义的任务数并等待所有任务完成。简化,这就是我正在处理的事情:
[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
}
答案 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);
}