7

我有一个 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);

当 Progress == 100 时如何取消订阅?如果我在 .Where 子句之后添加一个 .Take(1) 调用,那会自动取消订阅吗?

4

2 回答 2

20

您可以使用 TakeWhile 方法:

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

TakeWhile在其谓词返回 false 时处理底层可观察序列,您不必手动调用 dispose。

于 2010-08-10T14:51:54.960 回答
19

一种选择是使用返回值Subscribe

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

...

// Unsubscribe
subscription.Dispose();

怀疑usingTake(1)确实会取消订阅,而且对您来说可能更整洁。看了一点,我很确定这取消订阅,因为它会触发“已完成”消息,该消息通常会自动取消订阅。我现在没有时间确定这个,恐怕:(

于 2010-08-10T14:10:27.770 回答