C# 什么';s source.StartWith(x).Replay(1)和source.Publish(x)之间的差异
给定一个序列,C# 什么';s source.StartWith(x).Replay(1)和source.Publish(x)之间的差异,c#,.net,system.reactive,C#,.net,System.reactive,给定一个序列,IObservable源,两者之间是否存在差异: var published = source.Publish(0); var publishedConnection = published.Connect(); 及 据我所知,他们非常相似。它们都有一个默认值为零,订阅时,观察者将立即从源接收最后一个值,并将源的所有其他值推送到订阅服务器 我有一个模糊的线索,我在某处读到(我现在找不到)如果source要完成,published不会将任何值传递给新订阅者,而是立即完成,而repl
IObservable源代码>,两者之间是否存在差异:
var published = source.Publish(0);
var publishedConnection = published.Connect();
及
据我所知,他们非常相似。它们都有一个默认值为零,订阅时,观察者将立即从源
接收最后一个值,并将源
的所有其他值推送到订阅服务器
我有一个模糊的线索,我在某处读到(我现在找不到)如果source
要完成,published
不会将任何值传递给新订阅者,而是立即完成,而replayed
仍会在完成之前将最后一个值重播给新订阅者
我是否正确地记住了这一点(任何人都能找到这样的来源),这两种方法之间还有什么区别吗?您列出的区别是准确的<代码>重播
重播,而发布
只是发布。我写了五行代码来检查这一点。没有其他显著差异。源代码也可以在上找到,尽管我承认对于那些不熟悉它的人来说,它不容易破译
代码:
尽管您知道这是一个技术细节,但可能值得注意的是,这些操作符之间的主要区别在于它们的用途:问题中的
Publish
的特定重载设计用于隐藏行为主体
,而Replay
设计用于隐藏ReplaySubject
。
var replayed = source.StartWith(0).Replay(1);
var replayedConnection = replayed.Connect();
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);