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();停止

 

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