C#使用Environment.TickCount 自定义的定时器类
阅读原文时间:2023年07月16日阅读:1

Environment.TickCount,

官网介绍:一个 32 位带符号整数,它包含自上次启动计算机以来所经过的时间(以毫秒为单位)。

*由于 TickCount 属性值的值是32位有符号整数,因此,如果系统连续运行,TickCount 将从零递增到 Int32.MaxValue 大约24.9 天,然后跳转到 Int32.MinValue,这是一个负数,然后在下一个24.9 天内递增为零。

我们可以通过实时获取系统启动后的毫秒数来实现定时器的定时功能;

首先建立一个Timer类,声明变量如下:

    enum\_State State;//定时器State  
    int startTime;       //开始时间  
    int endTime;        //结束时间  
    int interval;          //定时间隔  
    int stopTime;       //停止时间  
    int pauseTime;     //暂停时间  
    bool outMax;       //是否超出Int32.MaxValue

定时器状态如下,初始状态为Idle:

    enum enum\_State  
    {  
        \_Idle,  
        \_Busy,  
        \_TimeOut,  
        \_Stopped,  
        \_Pause  
    }

定时器开始启动函数,定时参数为整数,单位ms:

    public void Start(int time)  
    {  
        if (time <= )  
            time = ;  
        interval = time;  
        startTime = Environment.TickCount;  
        endTime = startTime + interval;  
        State = enum\_State.\_Busy;  
        stopTime = ;  
        pauseTime = ;  
        outMax = endTime < startTime;  
    }

定时器停止函数:

    public void Stop()  
    {  
        if (IsBusy() || IsPause())  
            stopTime = Environment.TickCount;  
        State = enum\_State.\_Stopped;  
        endTime = ;  
        pauseTime = ;  
    }

暂停定时器:

    public void Pause()  
    {  
        if (pauseTime == )  
            pauseTime = Environment.TickCount;  
        State = enum\_State.\_Pause;  
    }

继续定时器:

    public void Resume()  
    {  
        if (!IsPause())  
            return;  
        int val = pauseTime;  
        startTime = Environment.TickCount - val;  
        endTime = startTime + interval;  
        State = enum\_State.\_Busy;  
        pauseTime = ;  
        stopTime = ;  
        outMax = endTime < startTime;  
    }

重置定时器:

    public void Reset()  
    {  
        interval = ;  
        startTime = ;  
        endTime = ;  
        pauseTime = ;  
        stopTime = ;  
        State = enum\_State.\_Idle;  
    }

判断是否超时:

    public bool IsTimeOut()  
    {  
        int ticks = Environment.TickCount;  
        if (outMax)  
        {  
            if (ticks < startTime)  
                outMax = false;  
        }  
        if (!outMax && !IsPause())  
        {  
            if (IsBusy() && (ticks > endTime || ticks <=  && endTime >  && startTime > ))  
            {  
                stopTime = endTime;  
                State = enum\_State.\_TimeOut;  
            }  
        }  
        return State == enum\_State.\_TimeOut;  
    }

下面在程序中实例化一个Timer类timer1,并实现定时2s发送消息:

    public void Monitor()  
    {  
        timer1.Start(\*);  
        while (true)  
        {  
            Thread.Sleep();  
            //int i = Thread.CurrentThread.ManagedThreadId;  
            if (timer1.IsTimeOut())  
            {  
                comUp.comPort\_SendData(textBox\_ComSend.Text);  
                timer1.Start(\*);  
            }  
        }  
    }

看一下定时效果:

因为调用Winform窗台显示,线程执行,逻辑判断等需要一些时间,所以显示有一些偏差;

如官网介绍,使用Environment.TickCount时,注意24.9天左右会达到Int32.MaxValue,然后跳转到Int32.MinValue,再经过24.9天达到0,要注意对负数的处理;