如何将实体推送到Rx Observable?

时间:2015-03-25 17:59:24

标签: c# .net system.reactive

我有一个类负责在频繁但不规则的时间间隔内生成事件,其他类必须使用和操作。我想用Reactive Extensions来完成这项任务。

消费者方面非常直截了当;我有我的消费者类实现IObserver<Payload>,一切似乎都很好。问题出现在生产者类上。

直接实现IObservable<Payload>(也就是说,根据文档,我自己的IDisposable Subscribe(IObserver<Payload> )实现是不推荐的。它建议使用Observable.Create()函数集来构建。我的课程会运行很长时间,我尝试使用var myObservable = Observable.Never()创建一个Observable,然后,当我有新的Payloads时,调用myObservable.Publish(payloadData)。当我这样做时,我不会似乎在我的消费者中点击OnNext实现。

我认为,作为一种解决方法,我可以在我的类中创建一个事件,然后使用FromEvent函数创建Observable,但这似乎是一种过于复杂的方法(即看起来很奇怪) Observables的新热点要求'事件发挥作用)。有一个简单的方法我在这里俯瞰吗?创建自己的Observable源的“标准”方法是什么?

3 个答案:

答案 0 :(得分:6)

创建new Subject<Payload>并调用它的OnNext方法来发送事件。您可以与观察者一起Subscribe到主题。

对象的使用经常有争议。有关使用主题(链接到引物)的详细讨论,请参阅here - 但总的来说,此用例听起来有效(即它可能符合当地+热门标准)。

顺便说一句,订阅接受代表的重载可能会使您无需提供IObserver<T>的实现。

答案 1 :(得分:1)

Observable.Never()没有“发送”通知,您应该使用Observable.Return(yourValue)

如果您需要具体示例的指南,我建议您阅读Intro to Rx

答案 2 :(得分:0)

除非我遇到更好的方法,否则我现在所确定的是使用BlockingCollection

var _itemsToSend = new BlockingCollection<Payload>();
IObservable<MessageQueuePayload> _deliverer =
_itemsToSend.GetConsumingEnumerable().ToObservable(Scheduler.Default);