如果你觉得用 DotNet 自带的 DateTime 获取的时间精度不够,解决的方法是通过调用 QueryPerformanceFrequency 和 QueryPerformanceCounter这两个API来实现。

 ///<summary>
/// 获取时间的精度
///</summary>
///<param name="PerformanceFrequency"></param>
///<returns></returns>
[SuppressUnmanagedCodeSecurity]
[DllImport(
"kernel32")]
static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);
///<summary>
/// 获取时间计数
///</summary>
///<param name="PerformanceCount"></param>
///<returns></returns>
[SuppressUnmanagedCodeSecurity]
[DllImport(
"kernel32")]
static private extern bool QueryPerformanceCounter(ref long PerformanceCount);


下面是完整的封装代码:

///<summary>
/// 定义一个高精度的时间类
///</summary>
publicclass Timer
{
    #region private members
    private long ticksPerSecond =0;
    private long elapsedTime =0;
    private long baseTime =0;
    #endregion


    #region windows API
    ///<summary>
    /// 获取时间的精度
    ///</summary>
    ///<param name="PerformanceFrequency"></param>
    ///<returns></returns>
    [SuppressUnmanagedCodeSecurity]
    [DllImport(
"kernel32")]
    static private extern bool QueryPerformanceFrequency(reflong PerformanceFrequency);
    ///<summary>
    /// 获取时间计数
    ///</summary>
    ///<param name="PerformanceCount"></param>
    ///<returns></returns>
    [SuppressUnmanagedCodeSecurity]
    [DllImport(
"kernel32")]
    static private extern bool QueryPerformanceCounter(reflong 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 =0;
        QueryPerformanceCounter(
ref time);
        baseTime
= time;
        elapsedTime
=0;
    }

    ///<summary>
    /// 获取当前与最近一次 reset 时间差
    ///</summary>
    ///<returns>The time since last reset.</returns>
    public double GetTime()
    {
        long time =0;
        QueryPerformanceCounter(
ref time);
        return (double)(time - baseTime) / (double)ticksPerSecond;
    }
   

    ///<summary>
    /// 获取当前系统的时间 ticks 数
    ///</summary>
    ///<returns>The current time in seconds.</returns>
    public double GetAbsoluteTime()
    {
        long time =0;
        QueryPerformanceCounter(
ref time);
        return (double)time / (double)ticksPerSecond;
    }

    ///<summary>
    /// 获取此次与上次调用此方法的两次时间差
    ///</summary>
    ///<returns>The number of seconds since last call of this function.</returns>
    publicdouble GetElapsedTime()
    {
        long time =0;
        QueryPerformanceCounter(
ref time);
        double absoluteTime = (double)(time - elapsedTime) / (double)ticksPerSecond;
        elapsedTime
= time;
        return absoluteTime;
    }

    #endregion
}

调用代码:
Timer t
=new Timer();
t.GetAbsoluteTime();
t.GetElapsedTime();
t.Reset();
t.GetTime();

来自:http://dotnet.chinaitlab.com/ASPNET/742827.html



相关文章: