【问题标题】:On using Publish().RefCount()关于使用 Publish().RefCount()
【发布时间】:2013-12-05 17:52:24
【问题描述】:

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

例如,将一些传入的 IObservable json 翻译成两个 IObservable 属性时:

var anon = source.Select(TranslateToAnonObject);
this.Xs = anon.Select(GetXFromAnonObject);
this.Ys = anon.Select(GetYFromAnonObject);

为了避免执行两次翻译,我很想在匿名定义后面加上Publish().RefCount()

两个属性值也是一样的,以避免为每个订阅者单独执行Get.. 函数。

问题是,它已经到了我无法真正看到许多我不想想要的情况的地步。但如果这是正确的,它肯定会成为 Rx 的默认设置。我在想什么?

(想:是不是因为我几乎只在使用“热”的 observables?)

【问题讨论】:

    标签: c# system.reactive


    【解决方案1】:

    您确实经常想要这样做。事实上,我在这一点上写了一个article。它不是默认的原因很简单,它不是一直都需要的(并且比关闭更容易省略);在许多情况下,它只会增加开销,并且在很多情况下需要具有连接控制的 Publish(),因为订阅者数量可能会降至零,并且重新订阅会产生意想不到的副作用,尤其是(如您所说)在处理冷的 observables 时。

    【讨论】:

    • 是的,开销是我想知道的问题,但我想这是一种权衡,取决于吞吐量以及预期的订阅者数量。
    • 最大的问题是,如果 observable 在第一个观察者订阅之后产生值,但后续订阅者这样做 - 在这种情况下,后续订阅者会错过早期的值。我想很多人都没有预料到这一点。如果您需要每个订阅者获取所有值,那么只需在没有 .RefCount() 的情况下执行 .Publish()
    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2021-06-28
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多