在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
的描述不完全正确。
以下是Wait
和LastOrDefaultAsync
的相似之处:
- 两者都在逻辑上等待接收源可观察到的所有值。但正如Lee Cambell在回答中指出的那样,
Wait
阻塞了当前线程,而LastOrDefaultAsync
没有
以下是Wait
和LastOrDefaultAsync
之间的差异摘要:
-
如果可观测序列中没有元素,
Wait
抛出异常;CCD_ 16返回CCD_。 -
如果在观察可观察对象的过程中发生异常,
Wait
通过调用observer.OnError
报告异常,但随后也立即抛出异常;LastOrDefaultAsync
仅通过在所有订阅的观察者上调用observer.OnError
来报告异常。然而,如果出现错误,在这两种情况下,观察都会停止。
Rx的源代码附带的XML文档(甚至通过NuGet或MSI安装程序附带的二进制分发)解释如下:
等待可观察序列完成并返回最后一个元素。如果序列以OnError结束通知,则抛出异常。
异常
如果source
为空,则抛出ArgumentNullException
。
如果source
序列为空,则抛出InvalidOperationException
。