Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
425 views
in Technique[技术] by (71.8m points)

.net - IConnectableObservables in Rx

Can someone explain the differences between an Observable and a ConnectableObservable? The Rx Extensions documentation is very sparse and I don't understand in what cases the ConnectableObservable is useful.

This class is used in the Replay/Prune methods.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.

It's worth noting that some observable sources are hot by nature. For example, mouse events can fire regardless of whether we are subscribed to them. All a connectable observable would do in this scenario is a share a single event subscription.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...