Observable.Generate没有像我期望的那样快速生成。我错过了什么?

时间:2012-02-01 23:07:39

标签: c# system.reactive timespan

鉴于以下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。它必须是显而易见的东西,但我在这里缺少什么?

2 个答案:

答案 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毫秒之外。