Rx.NET中的Wait运算符的作用是什么



在Rx.NET库的v2.2.5中,有一个名为Wait的运算符被定义为:

public virtual TSource Wait<TSource>(IObservable<TSource> source)

MSDN上的类库引用和本页都没有提到这个运算符。

从它的实现来看,这有点太麻烦了,我猜它会等待可观察对象生成所有元素,如果可观察对象有任何元素,则返回最后一个元素,如果没有,则返回default(TSource)。但我不确定。

如果这是正确的,那么它与LastOrDefaultAsync有何不同?

它到底做什么?

intellisense文档似乎非常准确

等待可观察序列完成并返回序列的最后一个元素。如果序列以OnError通知终止,则抛出异常。

https://github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs#L493

因此,操作符将阻塞调用线程(YUCK!),直到序列完成,然后产生最后一个值。

CCD_ 4则返回CCD_。

方法的文档在Observable类上,而不是查询语言实现。

等待可观察序列完成并返回序列的最后一个元素
如果序列以OnError通知终止,则抛出异常。

https://github.com/Reactive-Extensions/Rx.NET/blob/v2.2.5/Rx.NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs#L493

它本质上是Last<TSource>()的同义词。

等待

最后一次

问题中对Wait的描述不完全正确。

以下是WaitLastOrDefaultAsync的相似之处:

  1. 两者都在逻辑上等待接收源可观察到的所有值。但正如Lee Cambell在回答中指出的那样,Wait阻塞了当前线程,而LastOrDefaultAsync没有

以下是WaitLastOrDefaultAsync之间的差异摘要:

  1. 如果可观测序列中没有元素,Wait抛出异常;CCD_ 16返回CCD_。

  2. 如果在观察可观察对象的过程中发生异常,Wait通过调用observer.OnError报告异常,但随后也立即抛出异常;LastOrDefaultAsync仅通过在所有订阅的观察者上调用observer.OnError来报告异常。然而,如果出现错误,在这两种情况下,观察都会停止。

Rx的源代码附带的XML文档(甚至通过NuGet或MSI安装程序附带的二进制分发)解释如下:

等待可观察序列完成并返回最后一个元素。如果序列以OnError结束通知,则抛出异常。

异常

如果source为空,则抛出ArgumentNullException

如果source序列为空,则抛出InvalidOperationException

相关内容

  • 没有找到相关文章

最新更新