C# 我如何使一个IObservable从一个队列,使序列不';队列为空时是否结束?

C# 我如何使一个IObservable从一个队列,使序列不';队列为空时是否结束?,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,我正在研究使用.NET(Rx)反应式扩展的东西,我希望有一个从队列(或类似队列)获取输入的序列 我试过这样做: static readonly Queue<DeviceTransaction> TransactionQueue = new Queue<DeviceTransaction>(); //... var observableTransactionSource = TransactionQueue.ToObservable(); /

我正在研究使用.NET(Rx)反应式扩展的东西,我希望有一个从队列(或类似队列)获取输入的序列

我试过这样做:

    static readonly Queue<DeviceTransaction> TransactionQueue = new Queue<DeviceTransaction>();
    //...
    var observableTransactionSource = TransactionQueue.ToObservable();
    //...
    observableTransactionSource.Subscribe(transactionObserver);
static readonly Queue TransactionQueue=new Queue();
//...
var observetTransactionSource=TransactionQueue.ToObservable();
//...
ObservateTransactionSource.Subscribe(transactionObserver);
它工作到一定程度,但当队列为空时,序列完成。我不想让一个空队列结束这个序列。空并不意味着结束,它只是意味着“此刻不再有”

当队列为空时,有没有办法停止序列的完成,或者我应该以另一种方式考虑整个问题?

调用
ToObservable()
充满了问题,正如我解释的,它只是使用
IEnumerable
并使用队列的快照

在这种情况下,您最好使用
主题来支持事件。由于Rx语法指定必须序列化事件的传递,因此它已经具有排队语义。只需拨打
OnNext
就可以发布事件

如果需要确保事件发布后订阅不会错过事件,请使用
ReplaySubject


如果使用某个主题与您有关,那么您可能需要复习。总结一下,使用队列表示在这里使用一个主题是很好的,但是您可能需要考虑是否可以使用一个转换方法,比如“代码>可观察的。FROMEVENT 。

您需要使用一个不同类型的集合,而不是使用<代码>队列< /C> >,一个在添加项时触发事件,例如,
observateCollection
或允许您等待添加项目,例如
BlockingCollection
(虽然您希望它是异步的,而不是同步的,所以BC不是理想的)。感谢James,这里有很多好的线索供您阅读和尝试。事实上,我并没有被队列的概念束缚住,因为我的组件的用户在某些时候会想要阻止事务(其他时候不会)。我开始想到我可能需要做一个主题。我将阅读你提供的链接,并发回我最终是如何做到这一点的…Dave Sexton的精彩博客文章。。。这就明确了:“我应该在什么时候使用一个主题?在没有任何直接外部源的情况下,强制且有条理地生成一个热的可观察对象。”我相信这非常清楚地说明了我的情况。最后,我创建了一个类,每次创建并使用一个新项目时都会引发一个事件
可观察。FromEventPattern()
来观察这个问题。它似乎有效,但我不确定这是否能保证序列化;如果多个线程正在生成新项目(因此事件可能会在多个线程上触发),会发生什么情况?如果可以同时引发事件,那么确实会导致问题。有一个经过深思熟虑的设计决策是为了提高性能,而不是到处添加对
OnNext
并发调用的检查。读一读-也呼吁其他平台-看看如何安全地使用一个主题在这种情况下,或考虑使用一些其他线程安全机制在您的事件。该评论似乎与您的原始答案不一致,它说:“RX语法强制序列化交付事件”。我当然依赖这种行为,事实上,这是我使用Rx的主要动机。也许我误解了?