Windows 上的计时器以每滴答 15.6 毫秒的速率运行。因此,即使您将计时器设置为 1 毫秒,仍然需要 15.6 毫秒才能完成(这确实取决于计时器启动的确切时间,但这就是它的要点)。 使用 timeBeginPeriod(1)(来自 Windows API),您可以将其设置为更高分辨率 1ms。
不幸的是,根据此处找到的文档,在 Windows 11 上,如果窗口拥有的进程最小化,则无法保证分辨率的提高: https://learn.microsoft.com/en-us/windows/win32/api/timeapi/nf-timeapi-timebeginperiod#:~:text=Starting 对于 Windows 11%2C,如果窗口拥有进程完全被阻塞%2C 最小化%2C 或以其他方式对最终用户不可见或听不到%2C Windows 不保证比默认系统分辨率更高的分辨率。有关此行为的更多信息,请参阅 SetProcessInformation
有没有办法保证 Windows 11 上的计时器具有更高的分辨率,即使窗口最小化时也是如此?或者是否有 timeBeginPeriod 的替代方案可以实现此解决方案?
我问的原因: 我们希望开始通过串行端口以 1 毫秒的间隔轮询一些高精度仪器并收集该数据,即使轮询的应用程序最小化也是如此。 有趣的笔记:
我一直在寻找与此相关的任何信息,但没有找到任何可以阐明这一点的更多细节。
您不需要深入到 P/Invoke 级别操作来使用高精度计时器,事实上您不应该这样做。您已经构建了 .Net 原语来实现此目的:
Stopwatch
将始终使用高精度计时数据,尽管它当然不是事件驱动对象,它是一个查询对象(即,您询问时间)。PeriodicTimer
是 .Net 6+ 异步计时器实现,并且将始终使用最高的可用精度来触发其可等待的延续。