Rx - 取消订阅活动

时间:2010-08-10 14:08:57

标签: c# system.reactive

我有一个INotifyPropertyChanged对象,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);

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

2 个答案:

答案 0 :(得分:18)

您可以使用TakeWhile方法:

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

当其谓词返回false时,TakeWhile 处理基础可观察序列, 不得不手动调用dispose。

答案 1 :(得分:13)

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

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

...

// Unsubscribe
subscription.Dispose();

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