我的执行 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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top