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

Я сделал, чтобы 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);

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

7
задан skaffman 10 August 2010 в 14:10
поделиться

2 ответа

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

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

...

// Unsubscribe
subscription.Dispose();

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

14
ответ дан 6 December 2019 в 05:42
поделиться

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

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

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

19
ответ дан 6 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: