异步触发多个任务并等待它们完成
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);
}
我有一种情况,我想异步触发用户定义数量的任务并等待所有任务完成。简化了,这就是我要处理的内容:
[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);
}