在Rx.Net的所有文献中都引用了通常称为可观测对象的温度的信息。
有冷的可观察对象(例如由Observable.Interval()
创建的可观察对象和类似的工厂方法),每次创建新的订阅时都会产生副作用。
在频谱的另一面,有热门可观察物(如Subject<T>
),它们将在新订阅时加入。
还有热的可观察变量,例如RefCount()
返回的变量,每次创建一个订阅时都会执行初始化,但前提是没有其他活动的订阅。这些here由Dave Sexton解释:
或者,您可以先调用Publish然后再调用RefCount来获取在多个连续的观察者之间共享的IObservable。请注意,这并不是真正的热观测-更像是热观测。当您的查询中至少有一个观察者时,RefCount可使对基础观察的单个订阅可见。当查询中没有更多的观察者时,将引用计数更改为0,将处理基础预订。如果以后有其他观察者订阅您的查询,将引用计数从0再次移动到1,则RefCount将使对基础可观察项的新订阅变为可订阅状态,从而再次发生订阅副作用。
还有其他应注意的温度吗?是否可以通过编程方式获得Observable的温度?
答案 0 :(得分:5)
第一个简单问题:
是否可以通过编程方式获得可观测物体的温度?
不。最好的办法就是订阅,然后看看会发生什么。
可观察的“合同”指定当您订阅可观察的消息时,您会收到零个或多个OnNext消息,还可以选择后面跟随一个OnCompleted或一个OnError消息。合同没有具体规定如何对待多个或之前/之后的订户,而这正是可观察到的“温度”问题。
还有其他应该注意的温度吗?
我什至不会以您指定的具体或离散术语来考虑它。
我是根据订阅效应来考虑的:最冷的可观察变量的所有效应都发生在订阅上(例如Observable.Return(42)
)。最热门的可观察对象对订阅(new Subject<int>()
)无效。在这两个极点之间是一个连续体。
Observable.Interval(TimeSpan.FromMilliseconds(100))
将每100毫秒发出一个新数字。该示例与Observable.Return(42)
不同,可以通过.Publish().RefCount()
进行“预热”:第一个用户开始编号,但是第二个用户将看到唯一的最新编号,而不是从0开始。 ,如果您执行的是.Publish()
而不是.Replay(2).RefCount()
,那么您会有一些按需订阅的效果。 Publish
和Replay
的可观察物是否具有相同的“温度”?