2011-06-26 67 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。我的用例是我需要一个父容器来设置一个更新的标志,如果其中的任何一个孩子被更新以响应一个事件。 –