我有这个代码:
public void replay() { long previous = DateTime.Now.Ticks; for (int i = 0; i < 1000; i++) { Thread.Sleep(300); long cur = DateTime.Now.Ticks; Console.WriteLine(cur - previous); previous = cur; } }
这被调用为一个单独的线程,如下所示:
MethodInvoker replayer = new MethodInvoker(replay); replayer.BeginInvoke(null, null);
但是,如果我观察输出,它的行为很奇怪.它i
成对输出.例如,它将等待一个完整的等待,然后输出i
,然后快速输出下一个i
,然后再次等待.为什么这样做,我该如何纠正呢?
它输出这个:
3125040 2968788 2968788 2968788 3125040 2968788 2968788 2968788 3125040 2968788 2968788 2968788 3125040
如果我将睡眠时间增加到一秒以上,则不会发生这种情况.
更改代码以消除分析中的显示延迟:
public void replay() { Thread.Sleep(5000); DateTime start = DateTime.Now; for (int i = 0; i < 1000; i++) { Console.WriteLine(string.Format("Exec:{0} - {1} ms", i, DateTime.Now - start)); start = DateTime.Now; Thread.Sleep(300); } }
查看修改后的输出,循环延迟中的方差小于5%(300中的15ms).这是正常的,因为操作系统实际上将时间片分配给线程时所涉及的不确定性......(如果我没记错,在Windows操作系统中,这通常只需要每20毫秒!)
您在控制台输出中感知到的较大差异几乎可以肯定是由于显示器的延迟.
无法重现.我想知道它是否是你机器本地的东西; 也许是缓冲.