拆分IObservable&lt;(long,float)&gt;进入两个可观察的IObservable <long>和IObservable <float>

时间:2017-09-28 01:42:20

标签: c# system.reactive

我有一个IObservable<(long, float)>类型的流(热可观察),并希望将其拆分为两个IObservable<long>IObservable<float>

的可观察对象

我天真地试过以下但我只填了flowStream

IObservable<long pressure, float flow> sourceHotObservable = GetStream(); 

var pressureStream = sourceHotObservable.Select(i => i.pressure);
var flowStream = sourceHotObservable.Select(i => i.flow);

2 个答案:

答案 0 :(得分:2)

您当前的代码似乎运行良好。

如果我试试这个:

var sourceHotObservable = Observable.Return((pressure: 1L, flow: 3.0f)).Publish();

var pressureStream = sourceHotObservable.Select(i => i.pressure);
var flowStream = sourceHotObservable.Select(i => i.flow);

pressureStream.Subscribe(Console.WriteLine);
flowStream.Subscribe(Console.WriteLine);

sourceHotObservable.Connect();

我明白了:

1
3

答案 1 :(得分:0)

您没有在您的代码段中向我们展示您如何订阅流 - 您只向我们展示了中间.Select()语句。 但是,我怀疑你以后正在打电话。在每个订阅上订阅,并且您的流在第一次订阅时变为Hot,导致第二次错过更新。

请改为尝试:

IObservable<long pressure, float flow> sourceHotObservable = GetStream().Publish();

...然后在您的订阅代码之后......

sourceHotObservable.Connect(); //be sure to manage lifetime of returned disposable

Enigmativity回复了一个答案,显示代码正常工作,但他对Observable.Return()的使用实际上是一个冷流。这意味着每个订阅都会获得一个带有返回项的新Observable,因此它可能不是您自己场景的准确表示。如果您的第一个订阅时您的信息流变热,您可能会错过第二个订阅中的项目。

告诉我们。