我正在某些类上实现IObservable<T>
接口。我使用Reflector来确定Rx中通常如何做到这一点。关于观察者如何跟踪其订阅者并通过他们的OnNext
方法通知他们,我偶然发现了与此类似的代码:
private List<Observer<T>> observers;
// subscribe a new observer:
public IDisposable Subscribe(IObserver<T> observer)
{
observers.Add(observer);
...
}
// trigger all observers' OnNext method:
...
foreach (IObserver<T> observer in observers)
{
observer.OnNext(value);
}
由于所有代表都是多播的,因此不能简化为:
Action<T> observers;
// subscribe observer:
public IDisposable Subscribe(IObserver<T> observer)
{
observers += observer.OnNext;
...
}
// trigger observers' OnNext:
...
observers(value);
或者第一种方法(性能,线程/并发问题,......)是否具有特定优势?
答案 0 :(得分:5)
通常,单独调用代理可以让您更好地控制行为:
答案 1 :(得分:4)
通常您不自己实现IObservable<T>
,使用其中一种生成方法(如IObservable<T>
)从方法返回Observable.Create
。
但是,如果您要自己实现接口,则应该包装一个内部Subject<T>
,它将为您处理所有并发问题:
public class CustomObservable<T> : IObservable<T>
{
private Subject<T> subject = new Subject<T>();
public IDisposable Subscribe(IObserver<T> observer)
{
return subject.Subscribe(observer);
}
private void EmitValue(T value)
{
subject.OnNext(value);
}
}
NB:如果您决定坚持代表(无论出于何种原因),至少要确保取消订阅IDisposable
返回值:
observers += observer.OnNext;
return Disposable.Create(() => observers -= observer.OnNext);