鉴于以下RX代码:
static void Main(string[] args)
{
int x = 0;
const int timerMilliseconds = 1000 * 30; //30 seconds
var disposable = Observable.Generate(0, i => true, i => 1, i => 1, i => TimeSpan.FromMilliseconds(1))
.Subscribe(i => Interlocked.Increment(ref x));
var timer = new Timer(o =>
{
disposable.Dispose();
Console.WriteLine("Disposed of observable. Current total: " + x);
}, null, timerMilliseconds, timerMilliseconds);
Console.ReadKey(true);
timer.Dispose();
}
如果我运行此代码,30秒后(在我的机器上)的输出是~1924,这对我来说有点令人惊讶。我原以为延迟一毫秒,30秒后数量应该接近~30,000。它必须是显而易见的东西,但我在这里缺少什么?
答案 0 :(得分:4)
我认为你忘记了Windows操作系统并没有给你一个硬保证,即生成和/或观察线程将被安排在下一毫秒内运行。根据系统的状态,也可能涉及上下文切换的一些开销。在我生锈的旧笔记本电脑上,我没能达到约20毫秒。 (我在Stopwatch
的帮助下测量了" Subscribe" lambda的调用之间的时间。)
答案 1 :(得分:2)
@afrischke是对的。当您未指定另一个调度程序时,它似乎与在后台使用System.Timers.Timer
来安排Generations有关。最初,我得到了与你相同的结果,我特别注意到它没有产生任何可测量的CPU活动。当我将代码更改为以下内容时,我(可能并不奇怪)得到一个更大的数字:
var generator = Observable.Generate(0, i => true, i => 1, i => 1, i => TimeSpan.FromTicks(1));
var disposable = generator.Subscribe(i => Interlocked.Increment(ref x));
我认为正在发生的事情是Observable正在遵守法律条文 - 它正在安排下一代至少一毫秒之外,但不久之后。实际上,事实证明这实际上更像是在10毫秒之外。