Rx - 取消订阅活动

Jud*_*ngo 7 c# system.reactive

我有一个INotifyPropertyChanged对象,Foo.我使用Rx的FromEvent方法将Foo转换为可观察的事件流:

var myFoo = new Foo();
var eventStream = Observable.FromEvent<PropertyChangedEventArgs>(myFoo, "PropertyChanged");
Run Code Online (Sandbox Code Playgroud)

现在我想听一个特定的属性改变,如果.Progress == 100,取消订阅:

eventStream
   .Where(e => myFoo.Progress == 100)
   .Subscribe(OnFooFinished);
Run Code Online (Sandbox Code Playgroud)

如果进度== 100,我如何取消订阅?如果我在.Where子句后添加.Take(1)调用,那会自动取消订阅吗?

Mar*_*son 19

您可以使用TakeWhile方法:

eventStream.TakeWhile(e => myFoo.Progress != 100);
Run Code Online (Sandbox Code Playgroud)

TakeWhile 在其谓词返回false时处置基础可观察序列,您不必手动调用dispose.


Jon*_*eet 14

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

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

...

// Unsubscribe
subscription.Dispose();
Run Code Online (Sandbox Code Playgroud)

怀疑使用Take(1)确实会取消订阅,而且它可能更适合你.看了一下之后,我很确定这取消订阅,因为它会触发"已完成"的消息,该消息通常会自动取消订阅.我现在没有时间检查这个,我害怕:(

  • 所有Rx运算符都使用包装器来确保取消订阅(Dispose),onCompleted和onError之间的dispose行为相同 (2认同)