如果你觉得用 DotNet 自带的 DateTime 获取的时间精度不够解决的方法是通过调用 QueryPerformanceFrequency 和 QueryPerformanceCounter这两个API来实现 /// <summary> /// 获取时间的精度 /// </summary> /// <param name=PerformanceFrequency></param> /// <returns></returns> [SuppressUnmanagedCodeSecurity] [DllImport(kernel)] static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency); /// <summary> /// 获取时间计数 /// </summary> /// <param name=PerformanceCount></param> /// <returns></returns> [SuppressUnmanagedCodeSecurity] [DllImport(kernel)] static private extern bool QueryPerformanceCounter(ref long PerformanceCount); 下面是完整的封装代码 /// <summary> /// 定义一个高精度的时间类 /// </summary> public class Timer { #region private members private long ticksPerSecond = ; private long elapsedTime = ; private long baseTime = ; #endregion #region windows API /// <summary> /// 获取时间的精度 /// </summary> /// <param name=PerformanceFrequency></param> /// <returns></returns> [SuppressUnmanagedCodeSecurity] [DllImport(kernel)] static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency); /// <summary> /// 获取时间计数 /// </summary> /// <param name=PerformanceCount></param> /// <returns></returns> [SuppressUnmanagedCodeSecurity] [DllImport(kernel)] static private extern bool QueryPerformanceCounter(ref long PerformanceCount); #endregion #region constructors /// <summary> /// new /// </summary> public Timer() { // Use QueryPerformanceFrequency to get frequency of the timer if (!QueryPerformanceFrequency(ref ticksPerSecond)) throw new ApplicationException(Timer: Performance Frequency Unavailable); Reset(); } #endregion #region public methods /// <summary> /// 重置时间相关计数器 /// </summary> public void Reset() { long time = ; QueryPerformanceCounter(ref time); baseTime = time; elapsedTime = ; } /// <summary> /// 获取当前与最近一次 reset 时间差 /// </summary> /// <returns>The time since last reset</returns> public double GetTime() { long time = ; QueryPerformanceCounter(ref time); return (double)(time baseTime) / (double)ticksPerSecond; } /// <summary> /// 获取当前系统的时间 ticks 数 /// </summary> /// <returns>The current time in seconds</returns> public double GetAbsoluteTime() { long time = ; QueryPerformanceCounter(ref time); return (double)time / (double)ticksPerSecond; } /// <summary> /// 获取此次与上次调用此方法的两次时间差 /// </summary> /// <returns>The number of seconds since last call of this function</returns> public double GetElapsedTime() { long time = ; QueryPerformanceCounter(ref time); double absoluteTime = (double)(time elapsedTime) / (double)ticksPerSecond; elapsedTime = time; return absoluteTime; } #endregion } 调用代码 Timer t = new Timer(); tGetAbsoluteTime(); tGetElapsedTime(); tReset(); tGetTime(); |