2011-06-26 70 views
0

我有一些自定義事件參數工作這些,然後訂閱的Rx ForkJoin不與自定義事件

var events = new[] 
         { 
          Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel1, "AutoOccurActionPerformed"), 
          Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel2, "AutoOccurActionPerformed"), 
         }; 
events.ForkJoin().Subscribe(op => IsUpdatedByAutoOccur = op.Any(observedItem => observedItem.EventArgs.IsUpdatedByAutoOccur)); 

我的匿名委託在訂閱永遠不會被調用。沒有例外,代表只是從來沒有被調用。

但是,如果我訂閱的每個事件獨立,不ForkJoin,該事件被正確地處理(儘管seperately)

Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel1, "AutoOccurActionPerformed") 
       .Subscribe(o => IsUpdatedByAutoOccur = o.EventArgs.IsUpdatedByAutoOccur ? true : IsUpdatedByAutoOccur); 

Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel2, "AutoOccurActionPerformed") 
       .Subscribe(o => IsUpdatedByAutoOccur = o.EventArgs.IsUpdatedByAutoOccur ? true : IsUpdatedByAutoOccur); 

任何想法,爲什麼ForkJoin不工作?

回答

2

看看ForkJoin方法的intellisense幫助。儘管拼寫錯誤,它說:

並行運行兩個可觀察序列,並結合他們的最後elemenets。

由於您對事件做了ForkJoin,您永遠不會得到結果,因爲這些類型的observables從未完成。

你可能想用MergeCombineLatest來達到你想要的,但是由於你沒有描述你的意圖,所以我不能給出更好的建議。

+0

我完全錯過了。使用Zip和CombineLatest都可以做到這一點。謝謝。 –

+0

@Ciaran - 確保你得到你需要的語義。如果兩個來源不總是產生值配對值,'Zip'確實可以很快變得不穩定。如果一個序列產生一個額外的值,那麼'Zip'總是不合適的。另一方面'CombineLatest'將總是產生兩個數值,如果你的兩個數據源成對產生數值並且這兩個數值中的一個將是一個「先前數值」和「當前數值」對。 「Zip」和「CombineLatest」都不可能滿足您的需求。 – Enigmativity

+0

感謝您的評論。兩個*都應該總是產生價值,但我也可以採取防禦行動並使用CombineLatest。我的用例是我需要一個父容器來設置一個更新的標誌,如果其中的任何一個孩子被更新以響應一個事件。 –