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