【发布时间】:2019-08-10 02:56:59
【问题描述】:
我有一组 100 个任务需要按任意顺序运行。将它们全部放入 Task.WhenAll() 往往会使后端超载,而我无法控制。
我想一次运行 n 个任务,每次完成后,再运行下一组。我写了这段代码,但是在任务运行之后,“控制台(正在运行...”)被打印到屏幕上,这让我觉得所有的任务都在运行。
如何强制系统真正“等待”每组任务?
//Run some X at a time
int howManytoRunAtATimeSoWeDontOverload = 4;
for(int i = 0; i < tasks.Count; i++)
{
var startIndex = howManytoRunAtATimeSoWeDontOverload * i;
Console.WriteLine($"Running {startIndex} to {startIndex+ howManytoRunAtATimeSoWeDontOverload}");
var toDo = tasks.Skip(startIndex).Take(howManytoRunAtATimeSoWeDontOverload).ToArray();
if (toDo.Length == 0) break;
await Task.WhenAll(toDo);
}
屏幕输出:
【问题讨论】:
-
您有 100 个任务正在运行,但您不知道它们将按什么顺序完成。 WhenAll 不会启动任务,它只是等待它们完成。听起来您真正想要的是限制启动。分组开始并等待该组完成,然后再开始下一组。
标签: c# for-loop async-await