使用并发队列在我的应用程序的两个组件之间传递对象

时间:2014-05-12 10:02:30

标签: c# multithreading concurrent-queue

我有一个我的程序,它使用c#并发队列将数据从我的一个组件传递到另一个组件。

组件1:    多个网络连接接收数据,然后将其放入此队列

组件2:  从此队列中读取数据,然后对其进行处理。

好的,好的都有意义(我当然希望)。

现在我想知道的是,在两个组件之间传递数据的最佳/最有效方法是什么?

选项1: 轮询队列以获取组件2中的新数据?这将需要阻止代码,或至少while(true)

选项2: 我不知道这是否可行,但这就是我在这里问的原因。队列数据结构是否具有一种功能,表明我的组件2可以注册到队列以通知任何插入/更改?这样,无论何时添加数据,它都可以获取它,然后我可以避免任何阻塞/轮询代码。

2 个答案:

答案 0 :(得分:2)

对于Producer / Consumer的简单实现,您可以尝试使用BlockingCollection。对于来自各种来源Reactive Extensions的更复杂的数据消费可能会有所帮助。这是一个更陡峭的学习曲线,但它是一个非常强大的基于拉力的框架,因此您不需要进行任何轮询。

答案 1 :(得分:2)

组件1(生产者)需要手动或自动阻止,因为您在生产时预计会有多次访问(提及多个帖子)。这意味着BlockingQueue在Component1中有意义。但是,在组件2(消费者)中,如果您认为您(在任何时候)只有一个消费者,那么您不需要任何阻止代码。

为了节省或避免使用,您必须需要一种机制来通知消费者某人已将某些内容添加到队列中。这可以使用自定义事件(不是在谈论EventHandle子类型)来实现。请记住,您可能没有这种事件样式的元素顺序。