【发布时间】:2021-01-21 06:48:23
【问题描述】:
目前正在试验 Observable.Interval,发现了一个我自己无法解释的行为。
_rate = Observable.Interval(TimeSpan.FromMilliseconds(250), scheduler).Select(_ => CalculateRateValue());
_thickness = Observable.Merge(_rate).Select(CalculateThicknessValue);
我在测试这个东西时的经验是,一旦我使用Observable.Merge,CalculateRateValue() 就会被调用两次。
直到今天,我的理解是,只要 _rate 上有一个新值,CalculateThicknessValue 就会以该新速率值调用。但不应该再次从源 observable 调用 Select 部分。
使用Zip 或某种Combine 时也会出现同样的情况。
测试代码如下:
TestScheduler scheduler = new TestScheduler();
long ticks = TimeSpan.FromMilliseconds(250).Ticks;
scheduler.AdvanceBy(ticks);
...
每次调用AdvanceBy 都会触发CalculateRateValue 两次。
那么为什么会出现这种行为,我能做些什么来阻止它呢?
CalculateRateValue 和 CalculateThicknessValue 是返回 double 的简单方法。
两个 observable 的类型也是 double。
【问题讨论】:
-
您能否编辑问题并包含
CalculateRateValue和CalculateThicknessValue方法的签名?另外我想问一下您是在使用TestScheduler时专注于产生理想的行为,还是专注于系统在生产环境中的行为。
标签: c# observable system.reactive