目前我有一个计时器,我假设每隔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毫秒,因此我的其余部分询问有关更快的替代方案。标题现已修改,以反映这一点。
答案 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);
}
您还可以参考:High-Performance Timer in C#