.net IObservable.Subscribe(IObserver<;T>;observer)重载用于什么?
当我编写.net IObservable.Subscribe(IObserver<;T>;observer)重载用于什么?,.net,system.reactive,.net,System.reactive,当我编写.Subscribe表达式时,我经常发现Resharper为我选择了以下重载,位于mscorlib中,版本=4.0.0.0: namespace System { public interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); } } 名称空间系统 { 可观察的公共接口 { IDisposable Subscribe(IObserver-o
.Subscribe
表达式时,我经常发现Resharper为我选择了以下重载,位于mscorlib中,版本=4.0.0.0:
namespace System
{
public interface IObservable<out T>
{
IDisposable Subscribe(IObserver<T> observer);
}
}
名称空间系统
{
可观察的公共接口
{
IDisposable Subscribe(IObserver-observer);
}
}
这似乎与大多数重载非常不同,重载采取了操作
,而且它来自mscorlib,而不是System.Reactive.
,这就是我所期望的大多数反应性内容
这个过载是做什么的?
如何使用?
IObserver
与Action
的关系如何?
为什么mscorlib中会出现这种单一重载?如果您查看
IObserver
,您可能会看到原因。该界面包含三种方法(或Action
s),其中使用最多的是OnNext
现在让我们看看操作的重载实现。扩展方法通过将提供的Action
作为OnNext
语义传递,实际为您生成IObserver
如果您希望处理OnError
和OnCompleted
通知,可以为所有接口方法实现提供Action
。要清楚,这不是过载,这是Rx真正的核心。所有其他的Subscribe
方法,以及所有其他操作符,都是最终调用它的扩展方法
如果您查看早期文档或Rx,您将看到创建者将其视为LINQ基于推送的一面。所以很多东西都是你在LINQ中看到的镜像IObservable
是IEnumerable
的镜像,IObserver
是IEnumerator
的镜像
但是,由于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));
}
公共静态IDisposable订阅(此IObservable源,操作onNext)
{
返回Subscribe(onNext,e=>{/*onError*/},()=>{/*onCompleted*/);
}
公共静态IDisposable订阅(此IObservable源、Action onNext、Action onError、Action onCompleted)
{
订阅(新的匿名观察者(onNext、onError、onCompleted));
}