使用并发队列在应用程序的两个组件之间传递对象
本文关键字:组件 两个 之间 对象 队列 并发 应用程序 | 更新日期: 2023-09-27 18:02:47
我有一个程序,它利用c#并发队列将数据从我的一个组件传递到另一个组件。
组件1:多个网络连接接收数据,然后将其放入此队列
组件2:从这个队列中读取数据,然后处理它。
好,一切都说得通(我真希望)。
现在我想知道的是,在两个组件之间传递数据的最佳/最有效的方法是什么?
选项1:轮询组件2中的新数据队列?这将需要阻塞代码,或至少while(true)
选项2:我不知道这是否可能,但这就是我来问你的原因。队列数据结构是否没有一种功能,说我的组件2可以注册到队列,以便在任何插入/更改时得到通知?这样,无论何时添加数据,它都可以直接获取它,然后我可以避免任何阻塞/轮询代码。
组件1(生产者)需要手动或自动阻塞,因为您期望在生产时多次访问(多个帖子提到)。这意味着BlockingQueue在Component1中是有意义的。然而,在组件2(消费者)中,如果你认为你只(在任何时候)有一个消费者,那么你不需要任何阻塞代码。
为了保存或避免while,您必须需要一种机制来通知消费者有人已将某些内容添加到队列中。这可以使用自定义事件(不讨论EventHandle子类型)来实现。请记住,在这种类型的事件中可能没有元素顺序。
对于一个简单的生产者/消费者的实现,你可以尝试使用BlockingCollection。对于来自各种来源的更复杂的数据消费,响应式扩展可能会有所帮助。这是一个非常陡峭的学习曲线,但它是一个非常强大的基于拉的框架,所以你不需要做任何轮询。