2016-06-14 48 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