在Rx.NET库的v2.2.5中,有一个名为Wait
的运算符,其定义如下:
public virtual TSource Wait<TSource>(IObservable<TSource> source)
class library reference on MSDN和this page都没有提到此运算符。
从查看它的实现,这有点过于繁琐,我猜它等待observable生成它的所有元素并返回最后一个元素如果observable有任何元素,如果没有,它返回default(TSource)
。但我不确定。
如果这是正确的,那么它与LastOrDefaultAsync
有什么不同?
它实际上做了什么?
答案 0 :(得分:1)
智能感知文档似乎非常准确
等待可观察序列完成并返回序列的最后一个元素。 如果序列以OnError通知终止,则抛出异常。
因此,运算符将阻塞调用线程(YUCK!),直到序列完成,然后产生最后一个值。
相反, LastOrDefaultAsync
会返回IObservable<T>
,因此不会阻止。
答案 1 :(得分:1)
方法的文档位于Observable
类,而不是查询语言实现。
等待可观察序列完成并返回序列的最后一个元素 如果序列以OnError通知终止,则抛出异常。
它基本上是Last<TSource>()
的同义词。
答案 2 :(得分:0)
问题中提供的Wait
说明并不完全正确。
以下是Wait
和LastOrDefaultAsync
之间的相似之处:
Wait
阻止当前线程,而LastOrDefaultAsync
则没有。以下是Wait
和LastOrDefaultAsync
之间差异的摘要:
如果可观察序列中没有元素,Wait
会抛出异常; LastOrDefault
返回default(TSource)
。
如果在观察observable期间发生异常,Wait
会通过调用observer.OnError
报告异常,但之后会立即抛出异常; LastOrDefaultAsync
仅通过在所有订阅的观察者上调用observer.OnError
来报告异常。但是,在出现错误时,两种情况都会停止观察。
Rx的源代码附带的XML文档(甚至是通过NuGet或MSI安装程序的二进制分发)也解释了这一点:
等待可观察序列完成并返回最后一个 序列的元素。如果序列以OnError终止 通知,抛出异常。
<强>例外强>
如果ArgumentNullException
为空,则抛出source
。
如果InvalidOperationException
序列为空,则抛出source
。