2016-06-14 25 views
0

在Rx.NET库V2.2.5,有一个名为Wait运营商被定义为这样:Rx.NET中的Wait运算符是做什么的?

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

无论是class library reference on MSDN也不this page提到这个操作符。

从看它的实现来看,这太麻烦了,我猜测它等待observable产生它的所有元素,并返回最后一个元素,如果observable有任何元素,如果没有,它返回default(TSource)。但我不确定。

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

它实际上做了什么?

回答

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>,因此不会阻塞。

+0

谢谢。你击败了我。发布问题后,我立即找到了答案。 –

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

+0

谢谢。在发布了我正在看错地方的问题后,我才意识到。 –

0

的问题提供Wait的描述是不完全正确。

下面是WaitLastOrDefaultAsync之间的相似性:

  1. 两个逻辑等待接收在源可观察到的所有的值。但正如Lee Cambell在他的回答中指出的那样,Wait会阻止当前线程,而LastOrDefaultAsync则不会。

这里是差异WaitLastOrDefaultAsync之间的总结:

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

  2. 如果观察到的观察期间发生异常,Wait通过调用observer.OnError报告异常,但随后也抛出该异常随即; LastOrDefaultAsync仅通过在所有订阅的观察者上调用observer.OnError来报告例外情况。但是,在错误的情况下,在这两种情况下,观察都停止了。

随附的源代码(或甚至与上述二值分布或者通过的NuGet或通过MSI安装)Rx之中的XML文档由此说明:

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

例外

抛出ArgumentNullException如果source为null。

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