什么是IObservable.Subscribe(IObserver <t> observer)重载?

时间:2017-04-07 03:43:20

标签: .net system.reactive

当我写.Subscribe个表达式时,我经常发现Resharper为我选择了以下重载,位于mscorlib,版本= 4.0.0.0:

namespace System
{
  public interface IObservable<out T>
  {
    IDisposable Subscribe(IObserver<T> observer);
  }
}

这似乎与大多数重载非常不同,这些重载需要Action,而且它来自mscorlib,而不是System.Reactive.*,这是我期望大部分Reactive内容的地方。

这次超载有什么作用? 该如何使用? IObserver<T>Action的关系如何? 为什么mscorlib会出现这种单一重载?

2 个答案:

答案 0 :(得分:5)

要明确的是,这不是一个过载,这真的是Rx的核心。所有其他Subscribe方法以及所有其他操作符,您已经习惯的是最终调用它的扩展方法。

如果您查看早期文档或Rx,您会看到创建者将其视为LINQ的基于推送的一面。所以很多东西都是你在LINQ中看到的镜像。 IObservableIEnumerable的镜像,IObserverIEnumerator的镜像。

然而,因为push与pull相反,所以Rx版本与其基于pull的版本相反:

  • IEnumerable定义了一种产生IEnumerator的方法。 IObservable定义了接纳 IObserver
  • 的一种方法
  • 如果您将IEnumerator.MoveNext() + IEnumerator.Current视为一个操作,则可以通过以下三种方式之一返回:返回下一个元素,到达收集结束或抛出异常。同样,IObserver必须处理三种情况:下一个元素(OnNext),流末尾(OnCompleted)或异常(OnError)。

Subscribe更熟悉的“重载”实际上只是扩展方法,如下所示:

public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext)
{
    return Subscribe(onNext, e => {/*onError */}, () => {/*onCompleted*/);
}

public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, Action onCompleted)
{
    source.Subscribe(new AnonymousObserver<T>(onNext, onError, onCompleted));
}

答案 1 :(得分:1)

如果你看IObserver,你可能会看到原因。界面包含三种方法(或Action s),最多&#34;使用&#34;他们是OnNext

现在让我们看看Action here的重载实现情况。扩展方法通过将提供的IObserver作为Action语义传递,实际为您生成OnNext

如果您希望处理ActionOnError通知,则可以为所有接口方法实现提供OnCompleted