如何实现从一个IObserver到另一个IObserver的原子切换?

| 我有一个
IObservable<byte[]>
,可以通过一些中间步骤将其转换为
IObservable<XDocument>
var observedXDocuments =
    from b in observedBytes
    // Lot of intermediate steps to transform byte arrays into XDocuments
    select xDoc;
在某个时间点,我对观察到的ѭ3感兴趣,所以我订阅了
IObserver<XDocument>
。在稍后的时间点上,我想再认购一个
IObserver<XDocument>
并处置旧的。 我如何在一次原子操作中做到这一点而又不丢失观察到的“ 3”?我可以做类似的事情:
oldObserver.Dispose();
observedXDocuments.Subscribe(newObserver);
不过我担心,在这两个电话之间,我可能会损失3英镑。如果我切换两个电话,可能会两次收到相同的
XDocument
。     
已邀请:
        我可能会添加一个间接层。编写一个名为ExchangeableObserver的类,将其订阅到您的可观察对象,并使其永久订阅。 ExchangeableObserver的工作是将所有内容委派给给定的子观察者。但是程序员可以随时更改要委派给的子观察者。在我的示例中,我有一个Exchange()方法。就像是:
public class ExchangeableObserver<T> : IObserver<T> {
  private IObserver<T> inner;

  public ExchangeableObserver(IObserver<T> inner) {
    this.inner=inner;
  }

  public IObserver<T> Exchange(IObserver<T> newInner) {
    return Interlocked.Exchange(ref inner, newInner);
  }

  public void OnNext(T value) {
    inner.OnNext(value);
  }

  public void OnCompleted() {
    inner.OnCompleted();
  }

  public void OnError(Exception error) {
    inner.OnError(error);
  }
}
    
        您可以使用一种信号量,确保
IObservable<byte[]>
IObservable<XDocument>
做准备时不会发生观察者变化。 伪代码如何做到这一点(不是睾丸)
  System.Threading.ReaderWriterLockSlim criticalSection 
       = new System.Threading.ReaderWriterLockSlim(...);  


  ... converting from `IObservable<byte[]>` to `IObservable<XDocument>`  
  criticalSection.EnterReadLock();
  Call IObservable<XDocument>
  criticalSection.ExitReadLock();

  .... replacing IObservable<XDocument>
  criticalSection.EnterWriteLock();
  Call change IObservable<XDocument>
  criticalSection.ExitWriteLock();
编辑:用
Call IObservable<XDocument>
  > What exactly do you mean with the line `Call IObservable<XDocument>`?
我解释你的观点
  > I have an `IObservable<byte[]>` that I transform 
  > into an `IObservable<XDocument>` using some intermediate steps...
您已经为
IObservable<byte[]>
注册了一个事件处理程序,该事件处理程序从
byte[]
创建了
XDocument
,然后调用 会触发ѭ1事件的事物。
Call IObservable<XDocument>
表示触发跟进事件的代码     

要回复问题请先登录注册