我可以并行添加并从ConcurrentQueue中获取吗?

时间:2014-02-03 21:50:39

标签: c# .net parallel-processing task-parallel-library concurrent-queue

我有一个用于从Web服务获取对象的类。我对这些对象的消费与订单无关,因此我会并行发布我的网络请求,并将结果添加到ConcurrentQueue

与此同时,在提出请求时,我们可以处理回复。

所以我希望能够在我的项目添加到ConcurrentQueue时迭代yield的内容。

如何让一个类填满队列,另一个类将其清空。它几乎肯定会比填充更快地清空,所以我不能在没有{{1}}的情况下枚举它,因为集合将是空的并且不会等待。

2 个答案:

答案 0 :(得分:4)

使用BlockingCollection打包ConcurrentQueueBlockingCollection的默认后备存储是ConcurrentQueue,因此您甚至不需要明确它

这允许您将消费者编写为:

foreach(var item in queue.GetConsumingEnumerable())
    Process(item);

答案 1 :(得分:2)

  1. 您可以使用BlockingCollection

  2. 您可以使用AutoResetEvent;消费者每当遇到空的时候都会等待它,而生产者在添加之后设置它(或者如果更适合这种模式,则批量添加)。

  3. 您可以让生产者线程进行实际处理。

  4. 第一个是最直接的。第二种方法几乎是实现第一种方法的一种方式,因此不会给你带来太大的好处,但如果你因某些原因需要从正常模式中改变一些东西,那么它会非常有用。第三个更麻烦,但我提到它是因为如果你的最终输出结果以复杂的方式结合,它有时会变得方便。