我有一个类负责在频繁但不规则的时间间隔内生成事件,其他类必须使用和操作。我想用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源的“标准”方法是什么?
答案 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);