我正在研究使用Reactive Extensions for .NET(Rx)的东西,我想要一个从队列(或类似)获取输入的序列。
我试过这样做:
static readonly Queue<DeviceTransaction> TransactionQueue = new Queue<DeviceTransaction>();
//...
var observableTransactionSource = TransactionQueue.ToObservable();
//...
observableTransactionSource.Subscribe(transactionObserver);
它可以工作到一个点,但是当队列为空时序列完成。我不希望空队列结束序列。空并不意味着结束,它只是意味着'暂时不再'。
有没有办法在队列为空时停止序列完成,还是应该以不同的方式考虑整个问题?
答案 0 :(得分:3)
调用ToObservable()
充满了问题,因为我解释here它只会使用IEnumerable<T>
并使用队列的快照。
在这种情况下,使用Subject<T>
支持您的活动可能会好得多。由于Rx语法强制执行事件的序列化传递,因此已经具有排队语义。只需在主题上调用OnNext<T>
即可发布活动。
如果您需要确保在发布事件后订阅不会遗漏事件,请使用ReplaySubject<T>
。
如果您使用主题,则可能需要查看this blog post。总而言之,您对队列的使用表明可以在此处使用主题,但您可能需要考虑是否可以使用Observable.FromEvent
之类的转换方法。