Я сделал, чтобы 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 пункта, который автоматически отказался бы от подписки?
Один из вариантов - использовать возвращаемое значение 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, вам не придется вызывать удаление вручную.