c#任务多队列限制

dcg*_*dcg 12 c# queue task task-parallel-library

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

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

任务系统的种类.我已经设法自己实现了这个使用普通的旧c#代码(又名System.Threading.Thread,lock和queue),它可以工作超过1年.但是,我一直在阅读有关TaskFactory和TaskScheduler奇迹的文章,关于.NET中内置类的可能性,但我没有找到证明这一点的例子.我想测试一下,并与我现在所做的比较,看看它是否工作得更好,如果有的话,更换它.

更多,我可以在不必限制/设置每个队列的并行线程数的情况下生存,只要我能够得到那个guarantee,即使队列#1在满负荷执行时imediatly执行队列#2的目标.

所以,我的问题是 - 是否有.net 4及更多内容,有人能指出我的样本吗?我整整一周都在寻找一个并没有得到相关的东西.

Jos*_*osh 8

使用TPL和新的集合实际上这非常简单System.Collections.Concurrent.

根据您的需求,BlockingCollection<T>我会推荐.默认情况下,它使用a ConcurrentQueue<T>作为底层商店,非常适合您的需求.

var queue = new BlockingCollection<Message>();
Run Code Online (Sandbox Code Playgroud)

设置一些处理这些消息的代码,并控制并行执行的代码数量就像这样简单:

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

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

那么这里发生了什么?好...

调用GetConsumingEnumerable()将实际阻止,直到有东西queue消耗.这很好,因为没有必要使用额外的代码来表明新工作已经准备就绪.相反,当queue填满时,您的(匿名)代表的新任务将被启动一个项目.

ParallelOptions对象允许您控制Parallel.ForEach操作方式.在这种情况下,您告诉它您永远不会希望一次执行超过10个任务.重要的是要注意Tasks!= Threads.细节是模糊不清的,但不用说,引擎盖下有很多优化.这一切都是可以插入的,但这不适合胆小的人.

显然我在这里没有涉及很多细节,但希望你能看到使用任务并行库有多么简单和富有表现力.

  • 这不是我得到的印象.他只是表示他需要能够控制并发任务的数量,这样任何人都不会占用所有资源.通过拥有多个队列,可以轻松扩展上述解决方案.填充这些队列取决于他,但通过这种方式控制可以并行执行的任务数量非常容易.一个50,另一个10,等等...... (2认同)