【发布时间】:2016-10-31 23:18:29
【问题描述】:
我有一个问题 IObervables 链是如何解决的。 我认为如果多个观察者订阅同一个 IObservable,则整个链只会在流发出新项目时被解析一次。
相反,似乎每个订阅都运行了整个链。
如果我的整个程序逻辑是使用 IObservables 并将它们链接在一起的,那么在我看来,代码正在运行相同的方法并获得相同的结果。
-
这是有意的行为吗?为什么?
-
如果是这样,可以避免吗?还是这是个坏主意?
以下代码是用 LINQPad 编写的:
{
var subject = Observable.Range(1, 1);
var observable1 = subject
.Select(value =>
{
var nextValue = value + 2;
Console.Write("\n Result of expensive computation: " + nextValue);
return nextValue;
});
var observable2 = observable1
.Select(value =>
{
var nextValue = 2 * value;
Console.Write("\n Result of another expensive computation: " + nextValue);
return nextValue;
});
observable2.Subscribe(_ => Console.Write("\n Data received on first subscription."));
observable2.Subscribe(_ => Console.Write("\n Data received on second subscription."));
}
结果:
昂贵计算的结果:3
另一个昂贵计算的结果:6
第一次订阅时收到的数据。
昂贵计算的结果:3
另一个昂贵计算的结果:6
第二次订阅时收到的数据。
不过我的预期:
昂贵计算的结果:3
另一个昂贵计算的结果:6
第一次订阅时收到的数据。
第二次订阅时收到的数据。
感谢您的任何回答。
干杯, 抢
【问题讨论】:
-
这是针对冷 Observable 的预期行为,可以通过使 Observable 变热来避免。我建议您阅读 Lee Campbell 的 Rx 简介中有关冷和热 Observables 的内容。 introtorx.com/content/v1.0.10621.0/… 或通过 SO 文档 stackoverflow.com/documentation/system.reactive/1325/…
-
谢谢你,这让我走上了正轨。我真的应该再读几遍那个网站。
标签: c# system.reactive