我应该使用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);