如何在Reactive Framework流中组合中间事件?

时间:2010-06-21 21:10:29

标签: c# system.reactive reactive-programming

我仍然是Rx的新手,并且很难弄清楚如何表达这个(看似)简单的订阅。我正在寻找这样的东西:

  1. 开始:InTransaction.Where(inTransaction => inTransaction)
  2. If:ItemChanged或On FlagChanged,让Changed = true
  3. 结束:InTransaction.Where(inTransaction =>!inTransaction)
  4. 以上所有都是可观察的。因此,在交易开始时,我想开始关注更改通知,无论有多少人进来,我都想记住任何收到的通知。当事务结束时,我想调用我的处理程序来更新可视状态。

    网上有很多有趣的例子,展示了如何为鼠标拖拽做这件事。我遇到的唯一问题是我不希望得到每一个改变的事件。我想知道在交易结束之前是否有任何遭遇。

    任何人都可以帮助我指出正确的方向吗?

    更新:我当前的算法看起来像这样:

    bool pendingRefresh = false;
    
    Observable
        .Merge(
            _selectionChanged,
            _objectManager
                .PropertiesChanged
                .Where(objects => objects.Contains(_selectedObject)))
        .Subscribe(_ => pendingRefresh = true);
    
    _actionManager
        .IsInTransaction.Where(isIn => !isIn)
        .Throttle(TimeSpan.FromSeconds(0.15))
        .Subscribe(_ => 
            {
                if (pendingRefresh)
                {
                    pendingRefresh = false;
                    Refresh();
                }
            });
    

    工作正常,但我想知道我是否可以通过单一订阅获得。

1 个答案:

答案 0 :(得分:3)

看起来你走在正确的轨道上。如果您不关心变更通知的数量,请查看Any运算符:

public static IObservable<bool> Any<TSource>(this IObservable<TSource> source)

这只会触发一次,当第一条消息进入时它将触发为真,如果OnCompleted发生而没有任何消息进来则会触发错误。

希望这有帮助。

杰弗里