我有一个用于从Web服务获取对象的类。我对这些对象的消费与订单无关,因此我会并行发布我的网络请求,并将结果添加到ConcurrentQueue
。
与此同时,在提出请求时,我们可以处理回复。
所以我希望能够在我的项目添加到ConcurrentQueue
时迭代yield
的内容。
如何让一个类填满队列,另一个类将其清空。它几乎肯定会比填充更快地清空,所以我不能在没有{{1}}的情况下枚举它,因为集合将是空的并且不会等待。
答案 0 :(得分:4)
使用BlockingCollection
打包ConcurrentQueue
(BlockingCollection
的默认后备存储是ConcurrentQueue
,因此您甚至不需要明确它
这允许您将消费者编写为:
foreach(var item in queue.GetConsumingEnumerable())
Process(item);
答案 1 :(得分:2)
您可以使用BlockingCollection
。
您可以使用AutoResetEvent
;消费者每当遇到空的时候都会等待它,而生产者在添加之后设置它(或者如果更适合这种模式,则批量添加)。
您可以让生产者线程进行实际处理。
第一个是最直接的。第二种方法几乎是实现第一种方法的一种方式,因此不会给你带来太大的好处,但如果你因某些原因需要从正常模式中改变一些东西,那么它会非常有用。第三个更麻烦,但我提到它是因为如果你的最终输出结果以复杂的方式结合,它有时会变得方便。