如何从队列中创建IObservable,以便在队列为空时序列不会结束?

时间:2015-05-18 20:43:36

标签: c# system.reactive reactive-programming

我正在研究使用Reactive Extensions for .NET(Rx)的东西,我想要一个从队列(或类似)获取输入的序列。

我试过这样做:

    static readonly Queue<DeviceTransaction> TransactionQueue = new Queue<DeviceTransaction>();
    //...
    var observableTransactionSource = TransactionQueue.ToObservable();
    //...
    observableTransactionSource.Subscribe(transactionObserver);

它可以工作到一个点,但是当队列为空时序列完成。我不希望空队列结束序列。空并不意味着结束,它只是意味着'暂时不再'。

有没有办法在队列为空时停止序列完成,还是应该以不同的方式考虑整个问题?

1 个答案:

答案 0 :(得分:3)

调用ToObservable()充满了问题,因为我解释here它只会使用IEnumerable<T>并使用队列的快照。

在这种情况下,使用Subject<T>支持您的活动可能会好得多。由于Rx语法强制执行事件的序列化传递,因此已经具有排队语义。只需在主题上调用OnNext<T>即可发布活动。

如果您需要确保在发布事件后订阅不会遗漏事件,请使用ReplaySubject<T>

如果您使用主题,则可能需要查看this blog post。总而言之,您对队列的使用表明可以在此处使用主题,但您可能需要考虑是否可以使用Observable.FromEvent之类的转换方法。