代码之家  ›  专栏  ›  技术社区  ›  Judah Gabriel Himango

RX-取消订阅活动

  •  7
  • Judah Gabriel Himango  · 技术社区  · 14 年前

    我有一个inotifyPropertiesChanged对象,foo。我使用Rx的FromEvent方法将foo转换为可观测的事件流:

    var myFoo = new Foo();
    var eventStream = Observable.FromEvent<PropertyChangedEventArgs>(myFoo, "PropertyChanged");
    

    现在,我要侦听特定属性是否已更改,如果.progress==100,则取消订阅:

    eventStream
       .Where(e => myFoo.Progress == 100)
       .Subscribe(OnFooFinished);
    

    当progress==100时,如何取消订阅?如果我在.where子句后添加.take(1)调用,它会自动取消订阅吗?

    2 回复  |  直到 14 年前
        1
  •  13
  •   Jon Skeet    14 年前

    一种选择是使用返回值 Subscribe :

    IDisposable subscription = eventStream.Where(e => myFoo.Progress == 100)
                                          .Subscribe(OnFooFinished);
    
    ...
    
    // Unsubscribe
    subscription.Dispose();
    

    犯罪嫌疑人 使用 Take(1) 当然会退订,而且 可以 为你保持整洁。看了一会儿,我很肯定 取消订阅,因为它将触发“已完成”消息,通常会自动取消订阅。恐怕我现在没有时间确认一下:(

        2
  •  17
  •   Markus Johnsson    14 年前

    您可以使用takewhile方法:

    eventStream.TakeWhile(e => myFoo.Progress != 100);
    

    取而代之 当其谓词返回false时,释放基础的可观测序列,您将 必须手动调用Dispose。