项目里面用到的这些看起来名字高大上的定时器测试下来也是非常不准。看了源码发现也是用System.Timers.Timer或者用的是Thread休眠的方式来实现的。100毫秒就不准了。直到一番搜索,发现利用多媒体定时器winmm.dll的MillisecondTimer是可用的。原文来自博客(dehai)Timer计时不准确的问题及解决方法”。代码如下:
- public sealed class MillisecondTimer : IComponent, IDisposable
- {
- //***************************************************** 字 段 *******************************************************************
- private static TimerCaps caps;
- private int interval;
- private bool isRunning;
- private int resolution;
- private TimerCallback timerCallback;
- private int timerID;
-
- //***************************************************** 属 性 *******************************************************************
- /// <summary>
- ///
- /// </summary>
- public int Interval
- {
- get
- {
- return this.interval;
- }
- set
- {
- if ((value < caps.periodMin) || (value > caps.periodMax))
- {
- throw new Exception("超出计时范围!");
- }
- this.interval = value;
- }
- }
-
-
- /// <summary>
- ///
- /// </summary>
- public bool IsRunning
- {
- get
- {
- return this.isRunning;
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- public ISite Site
- {
- set;
- get;
- }
-
- //***************************************************** 事 件 *******************************************************************
- public event EventHandler Disposed; // 这个事件实现了IComponet接口
- public event EventHandler Tick;
- //*************************************************** 构造函数和释构函数 ******************************************************************
-
- static MillisecondTimer()
- {
- timeGetDevCaps(ref caps, Marshal.SizeOf(caps));
- }
-
- public MillisecondTimer()
- {