C# 关于使用Publish().RefCount()的问题

C# 关于使用Publish().RefCount()的问题,c#,system.reactive,C#,System.reactive,我发现自己经常想使用Publish().RefCount()来“保护我的资源” 例如,将一些传入的IObservable json转换为两个IObservable属性时: var anon = source.Select(TranslateToAnonObject); this.Xs = anon.Select(GetXFromAnonObject); this.Ys = anon.Select(GetYFromAnonObject); 为了避免执行两次翻译,我会尝试在anon定义后面加一个P

我发现自己经常想使用
Publish().RefCount()
来“保护我的资源”

例如,将一些传入的IObservable json转换为两个IObservable属性时:

var anon = source.Select(TranslateToAnonObject);
this.Xs = anon.Select(GetXFromAnonObject);
this.Ys = anon.Select(GetYFromAnonObject);
为了避免执行两次翻译,我会尝试在anon定义后面加一个
Publish().RefCount()

对于这两个属性值也是一样的,以避免对每个订阅者分别执行
Get..
函数

问题是,这已经到了一个地步,我真的看不到很多我不想看到的情况。但如果这是正确的,它肯定是Rx的默认值。我怎么想的不对


(思考:是不是因为我几乎只处理“热”观测值?

你经常想这样做。事实上,我就这一点写了一篇文章。它不是默认值的原因很简单,因为它不是所有时间都需要的(而且省略比关闭更容易);在很多情况下,它只会增加开销,而在很多情况下,需要使用带有连接控制的Publish(),因为订阅者数量可能会降至零,重新订阅会产生意外的副作用,特别是(正如您所说)在处理冷观测时。

是,开销是我一直想知道的,但我想这是一种权衡,取决于吞吐量和期望的订阅者数量。最大的问题是,如果在第一个观察者订阅之后,可观察对象生成值,但后续订阅者会生成值,那么后续订阅者会错过早期的值。我想很多人都不这么认为。如果需要每个订阅服务器获取所有值,则只需执行
.Publish()
,而不使用
.RefCount()