winform 中使用定时器Timer

1)

int lostTime = 0;
 Object myobj = new object();
System.Timers.Timer timer = new System.Timers.Timer();

 

2)启动定时器

public void startWzTimer()
        {
            timer.Enabled = true;
            timer.Interval = 1000;//执行间隔时间,单位为毫秒;
            timer.Start();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(listenTimer);
        }

3)关闭定时器

        public void stopWzTimer() {
            timer.Enabled = false;
            timer.Stop();
            timer.Elapsed -= new System.Timers.ElapsedEventHandler(listenTimer);//注意这里,停止的时候,把定时器的事件也删除掉,否则,每次启动定时器,都加一个监听事件,那么越到后面,就会有越多的监听,这样不对
            button2.Enabled = true;
        }

4)监听


        public void listenTimer(object source, ElapsedEventArgs e)
        {
            //ShowMessage("定时任务运行:"+System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
            Console.WriteLine("定时任务运行1111:" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
            listenSerialPortReceive();
        }

        private void listenSerialPortReceive()
        {
            //创建一个委托,用于封装一个方法,在这里是封装了 控制更新控件 的方法
            Action invokeAction = new Action(listenSerialPortReceive);
            //判断操作控件的线程是否创建控件的线程
            //调用方调用方位于创建控件所在的线程以外的线程中,如果在其他线程则对控件进行方法调用时必须调用 Invoke 方法
            if (this.InvokeRequired)
            {
                //与调用线程不同的线程上创建(说明您必须通过 Invoke 方法对控件进行调用)
                this.Invoke(invokeAction);
            }
            else
            {
                //窗体线程,即主线程
                updateTextLog("接收串口数据任务运行:" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
                updateLostTime(1);
            }
        }

        public void updateLostTime(int initVlaue)
        {
            lock (myobj)
            {
                if (initVlaue != 0)
                {
                    lostTime++;
                    if (lostTime >= 8)
                    {
                        lostTime = 0;
                        stopWzTimer();
                        updateTextLog("接收串口数据超时");
                    }
                }
                else
                {
                    lostTime = 0;
                    stopWzTimer();
                }
            }
        }

5)使用

startWzTimer();启动

stopWzTimer();停止

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章