【问题标题】:Why is Observable.Merge() calling Select() on the source observable?为什么 Observable.Merge() 在源 observable 上调用 Select()?
【发布时间】:2021-01-21 06:48:23
【问题描述】:

目前正在试验 Observable.Interval,发现了一个我自己无法解释的行为。

_rate = Observable.Interval(TimeSpan.FromMilliseconds(250), scheduler).Select(_ => CalculateRateValue());
_thickness = Observable.Merge(_rate).Select(CalculateThicknessValue);

我在测试这个东西时的经验是,一旦我使用Observable.MergeCalculateRateValue() 就会被调用两次。 直到今天,我的理解是,只要 _rate 上有一个新值,CalculateThicknessValue 就会以该新速率值调用。但不应该再次从源 observable 调用 Select 部分。

使用Zip 或某种Combine 时也会出现同样的情况。

测试代码如下:

TestScheduler scheduler = new TestScheduler();
long ticks = TimeSpan.FromMilliseconds(250).Ticks;
scheduler.AdvanceBy(ticks);
...

每次调用AdvanceBy 都会触发CalculateRateValue 两次。

那么为什么会出现这种行为,我能做些什么来阻止它呢?


CalculateRateValueCalculateThicknessValue 是返回 double 的简单方法。 两个 observable 的类型也是 double

【问题讨论】:

  • 您能否编辑问题并包含CalculateRateValueCalculateThicknessValue 方法的签名?另外我想问一下您是在使用TestScheduler 时专注于产生理想的行为,还是专注于系统在生产环境中的行为。

标签: c# observable system.reactive


【解决方案1】:

通过将.Publish().RefCount() 添加到可观察对象来解决。

【讨论】:

  • .Publish().RefCount() 可能会导致脆弱的查询,只有在您消除任何其他原因时才应使用。您在问题中发布的代码并未证明您的问题 - 它每次只对CalculateRateValue 进行一次调用。您的代码中似乎有两个订阅,而您没有显示第二个。您能否更新您的问题,以便您的代码展示您的问题?
猜你喜欢
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2019-04-29
  • 2020-06-25
相关资源
最近更新 更多