使用任务并行库同时处理n个项目

Ron*_*rby 8 .net parallel-processing concurrency multithreading task-parallel-library

这一切都发生在Windows服务中.

我有一个Queue<T>(实际上是ConcurrentQueue<T>)等待处理的物品.但是,我不想一次只处理一个,我想同时处理n个项目,其中n是一个可配置的整数.

如何使用任务并行库进行此操作?

我知道TPL会代表开发人员对集合进行并发处理,但不确定这是否是我追求的功能.我是多线程和TPL的新手.

Jal*_*aid 4

使用BlockingCollection<T>而不是ConcurrentQueue<T>,那么你可以启动任意数量的消费者线程并使用Take的方法BlockingCollection。如果集合为空,该Take方法将自动阻塞在调用者线程中等待添加项目,否则线程将并行消耗所有队列项目。然而,正如您的问题提到 TPL 的使用一样,事实证明Parallel.ForEach在使用时存在一些问题,BlockingCollection请查看这篇文章以了解更多详细信息。所以你必须自己管理消费者线程的创建。new Thread(/*consumer method*/)或者new Task()...

  • 不,您可以使用它的 [GetConsumingEnumerable](http://msdn.microsoft.com/en-us/library/dd287186.aspx) 来代替。例如,“foreach (Item item in _collection.GetConsumingEnumerable())”,如果集合为空,它也会阻塞等待添加项目。 (2认同)