2012-01-01 76 views
2

是否可以強制多個RX訂閱到不同的觀察值連續運行(不是同時)?同步RX中的多個訂閱

我知道我可以使用EventLoopScheduler,但這會降低性能,因爲所有處理都將在單個線程上完成。

回答

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

在上面的示例中訂閱的是相同的observable。我的意思是將訂閱的執行序列化爲不同的觀察值。 (編輯我的問題澄清)。 – dux2 2012-01-02 06:28:01

+0

我有這樣的印象:這是不正確的(冷觀察結果不能連續運行) - 你能給這個信息提供參考嗎? – dux2 2012-01-02 07:12:38

+0

@ dux2我沒有引用方便,但它遵循冷觀察的定義(只有在您每次訂閱時才運行)。我最初發布的示例代碼演示了這一點。 – 2012-01-04 05:15:41