C# 如何在反应式框架流中组合中间事件?

C# 如何在反应式框架流中组合中间事件?,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,我对Rx还是个新手,很难弄明白如何表达这个(看似)简单的订阅。我在找这样的东西: bool pendingRefresh = false; Observable .Merge( _selectionChanged, _objectManager .PropertiesChanged .Where(objects => objects.Contains(_selectedObject))) .S

我对Rx还是个新手,很难弄明白如何表达这个(看似)简单的订阅。我在找这样的东西:

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();
            }
        });
  • 开始:InTransaction.Where(InTransaction=>InTransaction)
  • 如果:ItemChanged或On FlagChanged,则let Changed=true
  • 结束:InTransaction.Where(InTransaction=>!InTransaction)
  • 所有这些都是可以观察到的。因此,在事务开始时,我想开始关注更改通知,无论有多少通知,我只想记住任何通知都已收到。当事务结束时,我想调用我的处理程序来更新可视状态

    网上有很多有趣的例子,展示了如何对鼠标拖动执行此操作。我唯一的问题是,我不想改变每一件事。我只想知道在交易结束前是否有人被击中

    有人能帮我指出正确的方向吗

    更新:我当前的算法如下所示:

    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();
                }
            });
    

    工作正常,但我想知道我是否可以只订阅一次。

    看起来你走对了方向。如果您不关心收到多少更改通知,请查看Any operator:

    public static IObservable<bool> Any<TSource>(this IObservable<TSource> source)
    
    公共静态IObservable Any(此IObservable源)
    
    这只会触发一次,当第一条消息出现时,它将触发true,如果未完成而没有任何消息出现,它将触发false

    希望这有帮助

    杰弗里