3

所以情況就是這樣。假設我正在填寫一個收藏集。每次添加元素時,IObservable都會爲其訂戶調用OnNext。從IObservable <T>到任務

現在,將有一個點將收集收集。 (我正在讀東西,我讀完了..不管)。此時,訂閱者會調用OnComplete()。

但是,用戶不會觀察此方法。他寧可打電話給他一個異步的方法,他會等待......他不太關心他讀的東西,他只是在乎他讀完了。

所以基本上,我想從IObservable中獲得一個任務,當IObservable調用OnComplete()給它的訂閱者時返回該任務。我特別希望用戶不要使用觀察者,只是爲了知道在他的等待電話之後發生的任何事情會在收集完成後發生。

也許ToTask()方法有訣竅嗎?我無法通過文檔分辨出來。

+1

就像旁註一樣,你應該避免「混合你的單子」 - 這是「IEnumerable ','IObservable ',和'任務'之間的變化。每次更改都會在代碼中引入一個可能過早強制執行和/或引入意外行爲的問題。觀察對象比任務更強大和更有表現力,所以最好留在觀察對象中。 – Enigmativity 2015-02-24 06:49:08

+1

此外,重要的是要明白,即使observables被稱爲集合,他們不會「填充」。它們存在於時間維度中,因此它們是作爲實例及時發生的對象的實例。他們的時間表可能會或可能不會結束。 – Enigmativity 2015-02-24 08:02:39

+0

聽起來像你應該一路使用任務。你只有一個結果沒有流。 – user630190 2015-02-24 08:43:09

回答

7

如果您使用的是Rx 2.0或更高版本,則可以使用awaitIObservable,它返回observable中的最後一項。即觀察結束後。

var lastItem = await myObservable; 

這是可能的,因爲在的Rx 2.0 IObservable一個GetAwaiter擴展方法,然後加入使得有可能await可觀測量。還有一些方便的擴展方法可以讓你指定你想要等待的元素。

有一個不錯的博客關於它here

相關問題