c# - 我应该使用 List<IObserver> 还是简单地使用 Action<T> 来跟踪 IObservable 的订阅者?

标签 c# .net delegates system.reactive

我正在实现 IObservable<T>一些类的接口(interface)。我用了Reflector弄清楚这通常是如何在 Rx 中完成的.关于 observable 如何跟踪其订阅者并通过其 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);
}

由于所有委托(delegate)都是多播的,这不能简化为:

Action<T> observers;

// subscribe observer:
public IDisposable Subscribe(IObserver<T> observer)
{
    observers += observer.OnNext;
    ...
}

// trigger observers' OnNext:
...
observers(value);

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

最佳答案

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

  • 例如,如果一个委托(delegate)人提出异常,您可以继续调用其他委托(delegate)人,或者从您的列表中删除有问题的委托(delegate)人。
  • 如果您想并行调用委托(delegate),那真的很简单。
  • 如果您需要按特定顺序调用它们,您可以轻松保证正确的顺序(我不确定多播委托(delegate)调用的顺序是否已定义)。

关于c# - 我应该使用 List<IObserver> 还是简单地使用 Action<T> 来跟踪 IObservable 的订阅者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4003077/

相关文章:

c# - NHibernate 转换问题(怀疑原因是不正确的映射)

c# - 如何注册用户自定义热键?

.NET 优化的 Int32

iphone - 如何用两个相同的方法编写委托(delegate)协议(protocol)

c# - 委托(delegate)参数中的 Co(ntra) 方差

c# - 从 Google Android Management API 控制已注册 MDM 设备上的应用程序版本

c# - 检查 lambda 表达式中的 null - linq

c# - 从 c# 内存不足异常调用 c++ 委托(delegate)

.net - AutoMapper AssertConfiguration 在编译时?

.net - 以 "self learner"身份申请 .net 职位