【问题标题】:Rx ForkJoin is not working with custom eventRx ForkJoin 不适用于自定义事件
【发布时间】:2011-06-26 23:42:01
【问题描述】:

我有一些自定义事件参数:

AutoOccurPerformedEventArgs : EventArgs

并且在 2 个单独的位置引发了具有这些事件参数的相同事件我正在尝试使用反应式扩展来分叉加入这些然后订阅

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 的情况下单独订阅每个事件,则事件会得到正确处理(尽管是单独的)

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 不起作用的任何想法?

【问题讨论】:

    标签: silverlight system.reactive


    【解决方案1】:

    查看有关ForkJoin 方法的智能感知帮助。尽管有拼写错误,但它说:

    并行运行两个可观察序列并组合它们的最后一个元素。

    由于您正在对事件执行ForkJoin,因此您永远不会得到结果,因为这些类型的可观察对象永远不会完成。

    您可能想使用MergeCombineLatest 来实现您想要的,但由于您没有描述您的意图,我无法给出更好的建议。

    【讨论】:

    • 我完全错过了。同时使用 Zip 和 CombineLatest 就可以了。谢谢。
    • @Ciaran - 确保您获得了所需的语义。 Zip 如果这两个来源并不总是产生值配对值,那么它真的很快就会解开。如果一个序列产生一个额外的值,那么Zip 总是不同步的。另一方面,CombineLatest 将始终产生两个值,如果您的两个源成对产生值,并且这两个值中的一个将是“先前值”和“当前值”对。 ZipCombineLatest 都不太可能满足您的需求。
    • 感谢您的评论。两者都应该总是产生价值,但我不妨采取防御性行动并使用CombineLatest。我的用例是我需要一个父容器来设置一个更新的标志,如果它的任何一个子容器响应事件而更新。
    • @Ciaran - 在这种情况下,试试Merge。这听起来像是一个更好的选择。 Zip 绝对是错误的选择。 CombineLatest 可能会在“A”触发时给您错误的行为,然后在 10 分钟后触发“B” - 您的应用可能会认为“A”事件是当前事件,但实际上并非如此。
    • @Enigmativity - 但是如果我使用 Merge 然后订阅,那只会给我 1 个 EventArgs 实例,不是吗?还是每次引发的事件都会触发一次委托?
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2015-10-18
    相关资源
    最近更新 更多