Rx - отписаться от событий - PullRequest
7 голосов
/ 10 августа 2010

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

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 10 августа 2010

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

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

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

14 голосов
/ 10 августа 2010

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

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

...

// Unsubscribe
subscription.Dispose();

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

...