为了账号安全,请及时绑定邮箱和手机立即绑定

在 For 循环中运行任务组

在 For 循环中运行任务组

C#
守候你守候我 2023-08-20 10:59:03
我有一组 100 个任务需要以任意顺序运行。将它们全部放入往往Task.WhenAll()会使后端超载,这是我无法控制的。我想一次运行 n 个任务,每个任务完成后,然后运行下一组。我编写了这段代码,但是在任务运行后,“控制台(正在运行...”)被打印到屏幕上,这让我认为所有任务都正在运行。如何强制系统真正“等待”每组任务?//Run some X at a timeint 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);}屏幕输出:
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

有很多方法可以做到这一点,但我可能会使用一些提供更高级别抽象的库或框架,例如 TPL 数据流。

这比构建您自己的缓冲机制要容易得多。下面是一个非常简单的示例,但您可以对其进行不同的配置,并使用该库执行更多操作。在下面的示例中,我没有对它们进行批处理,但我确保同时处理的任务不超过 10 个。

我有一组 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);

}

屏幕输出:


查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信