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