gpt4 book ai didi

C#任务多队列节流

转载 作者:可可西里 更新时间:2023-11-01 08:25:09 25 4
gpt4 key购买 nike

我需要一个需要维护不同任务队列的环境,并且每个任务队列都有明确定义的并发线程数,可以为每个队列执行。像这样:

  • 队列 1 -> 3 个线程;
  • 队列 2 -> 6 个线程;

任务系统的种类。我已经成功地使用普通的旧 c# 代码(又名 System.Threading.Thread、锁和队列)自己实现了这一点,它可以正常工作 1 年以上。然而,我一直在阅读关于 TaskFactory 和 TaskScheduler 的奇迹的文章,关于 .NET 中内置类的可能性,但我没有找到一个例子来证明这一点。我想测试它并与我现在拥有的进行比较,看看它是否运行得更好,如果运行良好,则更换它。

此外,我可以不必限制/设置每个队列的并行线程数,只要我能得到保证,如果针对队列 #2 的项目立即执行,甚至如果队列 #1 正在满载执行。

所以,我的问题是 - .net 4 和更多版本中是否有一些东西,有人可以指点我一个示例吗?我整整一周都在寻找一个,但没有找到相关的东西。

最佳答案

使用 TPL 这实际上是非常简单的以及 System.Collections.Concurrent 中的新系列.

为满足您的需要 BlockingCollection<T> 是我会推荐的。默认情况下,它使用 ConcurrentQueue<T> 作为基础商店,非常适合您想要的东西。

var queue = new BlockingCollection<Message>();

要设置一些代码来处理这些消息,并控制可以并行执行的数量就这么简单:

//Set max parallel Tasks
var options = new ParallelOptions
{
MaxDegreeOfParallelism = 10
};

Parallel.ForEach(queue.GetConsumingEnumerable(), options, msg =>
{
//Do some stuff with this message
});

那么这里发生了什么?嗯……

调用 GetConsumingEnumerable() 实际上会阻塞直到queue中有东西消费。这很好,因为不需要额外的代码来发出新工作已准备就绪的信号。相反,作为 queue填满后,您的(匿名)委托(delegate)的新任务将以一个项目开始。

ParallelOptions 对象允许您控制如何 Parallel.ForEach 运作。在这种情况下,您告诉它您永远不希望在任何时候执行超过 10 个任务。 重要的是要注意 Tasks != Threads。细节尚不清楚,但不用说,幕后进行了大量优化。请注意,这一切都是可插拔的,但这不适合胆小的人。

显然有很多细节我没有在这里介绍,但希望您能看到使用任务并行库是多么简单和富有表现力。

关于C#任务多队列节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857269/

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