我应该使用List 还是仅使用Action 来跟踪IObservable的订户?

我正在某些类上实现IObservable接口。 我使用Reflector来弄清楚这是如何在Rx中完成的。 关于观察者如何跟踪其订阅者并通过他们的OnNext方法通知他们,我偶然发现了与此类似的代码:

 private List<Observer> observers; // subscribe a new observer: public IDisposable Subscribe(IObserver observer) { observers.Add(observer); ... } // trigger all observers' OnNext method: ... foreach (IObserver observer in observers) { observer.OnNext(value); } 

由于所有代表都是多播的,因此不能简化为:

 Action observers; // subscribe observer: public IDisposable Subscribe(IObserver observer) { observers += observer.OnNext; ... } // trigger observers' OnNext: ... observers(value); 

或者第一种方法(性能,线程/并发问题……)是否具有特定优势?

通常,单独调用委托可以让您更好地控制行为:

  • 例如,如果一个代表提出exception,您可以继续调用其他代理,或者从列表中删除出现故障的代理。
  • 如果你想并行调用代表,那真的很容易。
  • 如果您需要按特定顺序调用它们,您可以轻松保证正确的顺序(我不确定是否定义了多播委托调用的顺序)。

通常,您不会自己实现IObservable ,而是使用其中一种生成方法(如Observable.Create )从方法返回IObservable

但是,如果您要自己实现接口,则应该包装一个内部Subject ,它将为您处理所有并发问题:

 public class CustomObservable : IObservable { private Subject subject = new Subject(); public IDisposable Subscribe(IObserver observer) { return subject.Subscribe(observer); } private void EmitValue(T value) { subject.OnNext(value); } } 

注意:如果您决定坚持代表(无论出于何种原因),至少要确保您取消订阅您的IDisposable返回值:

 observers += observer.OnNext; return Disposable.Create(() => observers -= observer.OnNext);