用多媒体定时器或者QueryPerformanceFrequency和QueryPerformanceCounter那种方法来实现,性能和稳定性更好。又如何实现呢
------解决思路----------------------
首先必须强调windows不是实时操作系统,不应该把程序的正确性建立在定时器精度和稳定性上。
实际上高精度定时器就两种方案,一种是使用timeBeginPeriod把系统定时器精度设置到1ms,然后使用系统定时设施;另一种是使用QueryPerformanceCounter 的方式进行循环忙等待。不过它们都有副作用。
如果用第一种,那么实现有多种方式,比如你说的多媒体定时器,还有Thread.Sleep,ManualResetEvent.WaitOne,Socket.Poll 等等,这里面据说是Socket.Poll 稳定性最好,我做过简单的测试也确实如此。
提高系统定时器精度的副作用就是会导致系统整体性能下降,不过很多程序都会这么做,比如媒体播放器、游戏、QQ、Chrome、基于WPF的程序等等,见这里(需翻墙)。
如果用第二种,那么可以参考这里(需翻墙)的一个例子。这种忙等待的副作用就是浪费CPU资源,而且稳定性还依赖于线程优先级。
这里是有人做的几种不同方式定时器的测试也可以参考。另外,这里是我看到过的关于windows 定时的最详细的分析。
高精度定时器的具体实现也很难有通用的办法,必须自己根据实际情况实现并且反复调整。同时也需要考虑定时器失去同步后的处理。