2014-02-22 3 views
3

Итак, у меня есть BehaviorSubject<string>, который я хочу использовать для недвижимости. Я использовал метод блокировки First(), чтобы получить текущее значение, которое BehaviorSubject имеет в getter.BehaviorSubject.First() устарело, что альтернатива?

Операция First() устарела, так что же это новый способ достичь этого?

+0

Не могли бы вы поделиться текстом предупреждения? –

ответ

6

С BehaviorSubject<T> Вы гарантированы *, что имеющееся значение First всегда доступно.

Однако IObservable<T> операторы запросов не могут работать в соответствии с этим предположением в целом, так что атрибут Obsolete был добавлен загонять людей в сторону асинхронных методов, как FirstAsync - помочь им «упасть в яму успеха».

Из-за специального случая BehaviorSubject<T>, всегда имеющего установленное значение, он имеет резьбовое покрытие Value. Таким образом, если предположить, что у вас есть что-то вроде этого:

var subject = new BehaviorSubject<string>("Some value"); 

Тогда вы можете сделать это:

var current = subject.Value; 

* Попытка Асесс ценность BehaviorSubject<T> экземпляра после его метода Dispose был вызван, будь то по свойству Value или оператору запроса, например FirstAsync, приведет к выбросу ObjectDisposedException.

7

Ответ Джеймса замечательный, но я подумал, что стоит упомянуть общие альтернативы First, который работает для любого IObservable. Но определенно используйте свойство Value, если вы знаете, что это BehaviorSubject.

// synchronously wait for the value 
var value = someObservable.FirstAsync().Wait(); 

// async await 
var value = await someObservable.FirstAsync(); 
+0

Это на самом деле то, что я получаю после того, как я раскрываю «IObservable», однако, технически, другие ответы на ответ более применимы к вопросу, поэтому я поддержал это и пометил другой ответ как правильный. – Cheetah

+0

BehaviorSubject немного раздражает, потому что вы не можете выставить значение без раскрытия полного BehaviorSubject. Было бы неплохо, если бы существовал IBehaviorObservable, который расширил IObservable с помощью свойства .Value. –

Смежные вопросы