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

时间:2016-06-14 01:44:09

标签: system.reactive

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

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

class library reference on MSDNthis page都没有提到此运算符。

从查看它的实现,这有点过于繁琐,我猜它等待observable生成它的所有元素并返回最后一个元素如果observable有任何元素,如果没有,它返回default(TSource)。但我不确定。

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

它实际上做了什么?

3 个答案:

答案 0 :(得分:1)

智能感知文档似乎非常准确

  

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

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

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

相反,

LastOrDefaultAsync会返回IObservable<T>,因此不会阻止。

答案 1 :(得分:1)

方法的文档位于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

Last

答案 2 :(得分:0)

问题中提供的Wait说明并不完全正确。

以下是WaitLastOrDefaultAsync之间的相似之处:

  1. 逻辑上都等待接收源可观察对象中的所有值。但正如Lee Cambell在答案中指出的那样,Wait阻止当前线程,而LastOrDefaultAsync则没有。
  2. 以下是WaitLastOrDefaultAsync之间差异的摘要:

    1. 如果可观察序列中没有元素,Wait会抛出异常; LastOrDefault返回default(TSource)

    2. 如果在观察observable期间发生异常,Wait会通过调用observer.OnError报告异常,但之后会立即抛出异常; LastOrDefaultAsync仅通过在所有订阅的观察者上调用observer.OnError来报告异常。但是,在出现错误时,两种情况都会停止观察。

    3. Rx的源代码附带的XML文档(甚至是通过NuGet或MSI安装程序的二进制分发)也解释了这一点:

        

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

      <强>例外

      如果ArgumentNullException为空,则抛出source

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