2014-12-05 4 views
2

Учитывая последовательность, IObservable<int> source;, есть разница между:Какая разница между source.StartWith (х) .Replay (1) и source.Publish (х)

var published = source.Publish(0); 
var publishedConnection = published.Connect(); 

и

var replayed = source.StartWith(0).Replay(1); 
var replayedConnection = replayed.Connect(); 

Насколько я знаю, они очень похожи. Оба они имеют значение по умолчанию, равное нулю, при подписке наблюдатель немедленно получит последнее значение от source, а все дополнительные значения от source выталкиваются подписчику.

У меня есть смутное подозрение, что я где-то читал (что я не могу найти сейчас), что если source были завершить, published не передавать какую-либо ценность для новых абонентов, но вместо того, чтобы закончить немедленно, в то время как replayed бы еще переиграть последнее значение для новых подписчиков до завершения.

Я правильно это помню (и может ли кто-нибудь найти источник, заявляющий так), и существуют ли какие-либо другие различия между этими двумя методами?

ответ

2

Разница, которую вы указали, является точной. Replay повторяет, тогда как Publish просто публикует. Я проверил это, написав пять строк кода. Других существенных различий нет. Исходный код также доступен по адресу http://rx.codeplex.com - хотя я признаю, что он не поддается разглашению тем, кто не знаком с ним.

Код:

var source = Observable.Return(1); 

// comment out as appropriate: 
// this gives no output 
var conn = source.Publish(0); 
// this gives 1 
var conn = source.StartWith(0).Replay(1); 

conn.Connect(); 

conn.Subscribe(Console.WriteLine); 
+1

Хотя техническая деталь, как вы знаете, это может быть стоит отметить, что основное различие между этими операторами является их целью: Конкретное перегрузка 'Publish' в вопросе призвана скрыть 'BehaviorSubject' и' Replay' предназначены для скрытия 'ReplaySubject'. –

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