gpt4 book ai didi

c# - 并发执行有限数量的任务

转载 作者:行者123 更新时间:2023-11-30 22:55:57 30 4
gpt4 key购买 nike

假设我有一个 IEnumerable<Func<Task>>生成一些我想并发执行的(爬虫)任务,如何设置并发上限?

例如,我不希望同时运行超过 5 个这样的任务。另一方面,如果可能,应该始终运行 5 个任务。

我目前的做法是这段代码:

    public static async Task ExecuteConcurrent(IEnumerable<Func<Task>> taskGenerators, int maxDegreeOfConcurrency)
{
var executingTasks = new HashSet<Task>();
foreach (var taskGenerator in taskGenerators) {
while (executingTasks.Count >= maxDegreeOfConcurrency) {
executingTasks.Remove(await Task.WhenAny(executingTasks));
}

executingTasks.Add(taskGenerator());
}

await Task.WhenAll(executingTasks);
}

我想知道是否有更好的方法来做到这一点?也许,已经有可用的方法?

谢谢

最佳答案

听起来像是 TPL Dataflow 的工作

优点是:

  1. 它适用于 asyncawait 以及 CPU boundIO bound 工作负载
  2. 您可以使用 MaxDegreeOfParallelism 和许多其他选项来限制并发
  3. 您可以将其链接到更复杂的PipeLines
  4. Reactive Extensions 配合良好
  5. 这一切都是由 Parallel Stephen Toub 先生 为您打造的

Nuget System.Threading.Tasks.Dataflow


非常基本的例子

public static async Task DoWorkLoads(List<IPAddress> addresses)
{
var options = new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 50 // limit here
};

var block = new ActionBlock<SomeObject>(MyMethodAsync, options);

foreach (var ip in addresses)
block.Post(ip);

block.Complete();
await block.Completion;

}

...

public async Task MyMethodAsync(SomeObject obj)
{
// await something here
}

关于c# - 并发执行有限数量的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54821611/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com