我应该使用名单<IObserver> 或者简单动作<T> 跟踪一个IObservable的用户?
-
25-09-2019 - |
题
我的执行 IObservable<T>
界上一些课程。我用 反射器 图找出如何这通常是在 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);
或者有没有特定的优势,以第一种方法(性、螺纹/并发问题,...)?
解决方案
在一般情况下,呼吁代表们单独给你更多的控制权的行为:
- 如果一位代表提出了一个例外,你可以继续打电话的其他人,例如,或删除指责委托从你的名单。
- 如果你想要呼叫代表团在并行的,这真的很容易。
- 如果你需要叫他们在一定的顺序,可以很容易地保证正确的顺序(我不确定的顺序播委托电话是定义)。
其他提示
一般不实现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);
}
}
注意:如果您决定坚持使用委托(无论何种原因),至少确保您退订在IDisposable
返回值:
observers += observer.OnNext;
return Disposable.Create(() => observers -= observer.OnNext);
不隶属于 StackOverflow