Short answer:
IConnectableObservable
represents a pending hot observable that can be shared with multiple subscribers. Calling IConnectableObservable.Connect()
causes the change to hot (subscribes to the cold source observable)
Long answer:
A cold observable (like Observable.Range
) replays the sequence for each subscriber. It's analagous to a stopwatch, where every subscriber is given their own stopwatch. The subscriber starts the stopwatch by subscribing, and the stopwatch stops (and resets) once the observer stops observing.
A hot observable shares the sequence between all subscribers. It's analagous to there being one stopwatch and all subscribers are given the same time readout, regardless of when they started watching.
IObservable.Publish
converts a cold observable into a hot observable, but returns an IConnectableObservable
. This enables subscribers to subscribe to the (single) stopwatch before it starts. Calling IConnectableObservable.Connect()
starts the stopwatch. Disposing the Connect()
return value stops the stopwatch.
NOTE: I'm not sure how much I like my stopwatch analogy. Let me know if it was helpful or not.