2
A
回答
1
如果你的意思是運行一個可觀察的直到OnCompleted
然後開始下一個,你應該看看Concat
。如果您的意思是要同時訂閱多個不同的observables,則可以使用Merge
(如果語義對您的方案有意義)。如果合併不合適,我會建議在觀察者方法或您已知的EventLoopScheduler中使用標準線程同步方法之一(鎖定,監視等)。
編輯原來的答覆保存下面
是的,這是可以強制串行執行觀察員。但是,您是否需要取決於觀測值。一般來說,熱點觀測量已經連續運行,而冷態觀測量則不會。這是熱和冷觀察者工作方式的差異的副作用。爲了使觀察者變得冷熱,從而使觀察者連續運行,使用Publish
。這是一個演示各種行爲的例子。
Sub Main()
'hot observable, runs serially
Dim trigger As New ObsEvent
Dim eobs = Observable.FromEventPattern(Of ItemEventArgs(Of String))(
Sub(h) AddHandler trigger.Triggered, h,
Sub(h) RemoveHandler trigger.Triggered, h)
Dim sub1 = eobs.Subscribe(Sub(v)
Console.WriteLine("Starting event observer 1: {0}", v.EventArgs.Item)
Thread.Sleep(2000)
Console.WriteLine("Ending event observer 1")
End Sub)
trigger.Trigger("event trigger 1")
Dim sub2 = eobs.Subscribe(Sub(v)
Console.WriteLine("Starting event observer 2: {0}", v.EventArgs.Item)
Thread.Sleep(2000)
Console.WriteLine("Ending event observer 2")
End Sub)
trigger.Trigger("event trigger 2")
Console.WriteLine()
Console.WriteLine()
'cold observable, runs "simultaneously"
Dim tobs = Observable.Timer(TimeSpan.FromSeconds(5))
sub1 = tobs.Subscribe(Sub(v)
Console.WriteLine("Starting timer observer 1")
Thread.Sleep(2000)
Console.WriteLine("Ending timer observer 1")
End Sub,
Sub(ex) Console.WriteLine("Error"),
Sub() Console.WriteLine("Observer 1 completed"))
Thread.Sleep(500)
sub2 = tobs.Subscribe(Sub(v)
Console.WriteLine("Starting timer observer 2")
Thread.Sleep(2000)
Console.WriteLine("Ending timer observer 2")
End Sub,
Sub(ex) Console.WriteLine("Error"),
Sub() Console.WriteLine("Observer 2 completed"))
'cold observable turned hot, runs serially
Dim pobs = tobs.Publish()
sub1 = pobs.Subscribe(Sub(v)
Console.WriteLine("Starting publish observer 1")
Thread.Sleep(2000)
Console.WriteLine("Ending publish observer 1")
End Sub,
Sub(ex) Console.WriteLine("Error"),
Sub() Console.WriteLine("Observer P1 completed"))
Thread.Sleep(500)
sub2 = pobs.Subscribe(Sub(v)
Console.WriteLine("Starting publish observer 2")
Thread.Sleep(2000)
Console.WriteLine("Ending publish observer 2")
End Sub,
Sub(ex) Console.WriteLine("Error"),
Sub() Console.WriteLine("Observer P2 completed"))
pobs.Connect()
Console.ReadKey()
End Sub
相關問題
- 1. RX Java多訂閱
- 2. Rx處置訂閱
- 3. Rx中的一個觀察者的多個訂閱
- 4. 正確處置RX訂閱
- 5. Rx:使用異步函數進行訂閱並忽略錯誤
- 6. 用Rx訂閱TextBox的KeyUp事件?
- 7. C#如何重啓的RX訂閱
- 8. 同步iPhone的iPhone rss訂閱服務
- 9. Rx在Observable創建之前訂閱
- 10. 訂閱布爾狀態使用Rx
- 11. Angular 2訂閱訂閱另一個異步函數的服務
- 12. 同步操作問題RxJS observables訂閱
- 13. 同步嵌套訂閱在angular2
- 14. 使用Rx同步兩個流
- 15. Rx Java僅訂閱發出的一個項目
- 16. 訂閱JMS中的多個主題
- 17. RxSwift多訂閱一個observable
- 18. Socket.IO訂閱多個頻道
- 19. Dojo的發佈/訂閱 - 如何訂閱多個主題
- 20. Android MQTT異步訂閱
- 21. 反應擴展:轉換同步訂閱異步
- 22. Angular 2:很多異步管道和一個訂閱
- 23. 在GooglePlay中處理多個訂閱
- 24. 如何在同一功能中訂閱多個Redis頻道?
- 25. 我如何在不同的時間重複訂閱同一計劃的多個訂閱?
- 26. 有條件訂閱/取消訂閱多個郵件
- 27. Rx:忽略訂閱者造成的更新
- 28. freeOPCUA Python多訂閱
- 29. 訂閱NSNotification的多個對象(Objective-c)
- 30. Mqtt訂閱Contiki的多個主題
在上面的示例中訂閱的是相同的observable。我的意思是將訂閱的執行序列化爲不同的觀察值。 (編輯我的問題澄清)。 – dux2 2012-01-02 06:28:01
我有這樣的印象:這是不正確的(冷觀察結果不能連續運行) - 你能給這個信息提供參考嗎? – dux2 2012-01-02 07:12:38
@ dux2我沒有引用方便,但它遵循冷觀察的定義(只有在您每次訂閱時才運行)。我最初發布的示例代碼演示了這一點。 – 2012-01-04 05:15:41