我有一个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)调用,会自动取消订阅吗?
答案 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)
确实会取消订阅,并且可能更适合您。看了一下之后,我很确定这个会取消订阅,因为它会触发“已完成”的消息,该消息通常会自动取消订阅。我现在没时间检查这个,我很害怕:(