我需要一个需要维护不同任务队列的环境,并且每个任务队列都有一个定义良好的并发线程数量,可以为每个队列执行这些线程。就像这样:
一种任务系统。我已经成功地使用了普通的旧c#代码(也就是System.Threading.Thread、锁和队列)来实现这个功能,该代码在1+年中运行得非常好。然而,我一直在阅读关于TaskFactory和TaskScheduler的奇妙之处的文章,以及关于在.NET中使用内置类的可能性的文章,但是我没有找到一个例子来证明这一点。我想对它进行测试,并将它与我现在所拥有的进行比较,看看它是否运行得更好,如果它运行得更好,就替换它。
更重要的是,只要我能够获得guarantee,即使队列#1在满载时执行,也不必限制/设置每个队列的并行线程数。
所以,我的问题是-- .net 4和更多版本中是否有什么东西,有人能给我指一个样本吗?我整个星期都在找一个,但没有找到相关的东西。
发布于 2012-03-25 02:34:17
实际上,使用第三方物流和System.Collections.Concurrent中的新集合非常简单。
为了满足您的需要,我建议您使用BlockingCollection。默认情况下,它使用ConcurrentQueue作为底层存储,非常适合您的需要。
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填满时,带有(匿名)委托的新任务将以项开始。
ParallelOptions对象允许您控制Parallel.ForEach的操作方式。在这种情况下,您告诉它您永远不希望在任何时候执行超过10个任务。--注意任务!=线程是很重要的。细节是模糊的,但不用说,在引擎盖下正在进行许多优化。这都是你的心事,但这并不是给那些胆小的人用的。
显然,这里我还没有介绍很多细节,但是希望您能够看到使用任务并行库是多么的简单和有表现力。
https://stackoverflow.com/questions/9857269
复制相似问题