秒表运行速度超过15毫秒

时间:2015-05-14 10:23:54

标签: c# timer stopwatch

目前我有一个计时器,我假设每隔5ms称为TimerCallback字段中定义的方法,但在阅读了Timer类及其解析后,我发现Timer类只有15毫秒或更高的分辨率。

e.g。

autoDispatchTimer = new Timer(new TimerCallback(this.SendData), null, 0, 5);

我还研究过使用Stopwatch,因为它确实允许更高的分辨率,但我仍然不确定如何使用Stopwatch来执行相同的操作。无论如何,这可以使用Stopwatch对象完成吗?

这是一个阅读ElapsedMilliseconds属性并在那里调用SendData方法的情况,还是我误解了C#中的Stopwatch是如何工作的?

非常感谢您对此查询的帮助。

编辑:我完全理解计时器的准确度为15毫秒,因此我的其余部分询问有关更快的替代方案。标题现已修改,以反映这一点。

2 个答案:

答案 0 :(得分:1)

问题是Timer在后​​台暂停,在某些时候有时间做某事。保证不会比计时器中指定的时间更快(所以至少指定的时间,它可能需要更多)。我通常需要几毫秒才能回来。 timer accuracy is 15ms on Windows 7 and higher,所以没有机会像这样更快。

唯一比Timer更快的是while循环。您可以使用它,或重新考虑您的设计(至少,这就是我要做的)。

答案 1 :(得分:1)

计时器分辨率documentation表示:

  

系统计时器分辨率确定   Windows执行两次的频率   主要行动:

     
      
  • 更新计时器标记   如果完整的刻度已经过去,则计算。
  •   
  • 检查是否有预定的计时器对象   已过期。
  •   
     

计时器刻度是经过的概念   Windows用于跟踪的时间   一天中的时间和线程量子时间。   默认情况下,时钟中断和   计时器刻度是相同的,但Windows   或者应用程序可以更改时钟   中断期。

     

默认计时器   Windows 7的分辨率为15.6   毫秒(ms)。一些应用程序   减少到1毫秒,这减少了   移动系统上的电池运行时间   多达25%。

但是你可以试试这个:

[DllImport("ntdll.dll", EntryPoint = "NtSetTimerResolution")]
public static extern void NtSetTimerResolution(uint DesiredResolution, bool SetResolution, ref uint CurrentResolution);

private void Foo()
{
    uint DesiredResolution = 9000;
    bool SetResolution= true;
    uint CurrentResolution = 0;

    NtSetTimerResolution(DesiredResolution, SetResolution, ref CurrentResolution);
}

Source

您还可以参考:High-Performance Timer in C#