Rx - отмена подписки на события

У меня есть объект INotifyPropertyChanged, Foo. Я превращаю Foo в наблюдаемый поток событий, используя метод Rx FromEvent:

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

Теперь я хочу прослушать определенное свойство, и если .Progress == 100, отпишитесь:

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

Как я могу отказаться от подписки, когда Progress == 100? Если я добавлю вызов .Take(1) после предложения .Where, будет ли он автоматически отменять подписку?

2 ответа

Один из вариантов - использовать возвращаемое значение Subscribe:

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

Я подозреваю, что использование Take(1) действительно отменяет подписку, и, возможно, оно может быть более аккуратным для вас. Посмотрев на это немного, я уверен, что это отменит подписку, так как оно запустит "завершенное" сообщение, которое обычно автоматически отписывается. Я не успеваю проверить это наверняка на данный момент, я боюсь: (


Вы можете использовать метод TakeWhile:

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

TakeWhile будет располагать основную наблюдаемую последовательность, когда предикат возвращает false, вам не нужно будет вызывать dispose вручную.

licensed under cc by-sa 3.0 with attribution.