基本用法:
timer1.Interval = 500; //单位ms
timer1.Start(); //timer1.Enabled=true也可
//然后500ms后如果没有进程在执行(其实不知道进程是个什么鬼),就进入timer1_Tick执行
private void timer1_Tick(object sender, System.EventArgs e)
{
timer1.Stop();
timer1.Interval = 500;
MessageBox.Show("延时时间到", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
犯过的错,如下案例分析:
int DelayFlag=0;
private void DelayTest()
{
//事件a
timer1.Interval = 500;
timer1.Start();
while(DelayFlag == 0) -----------------------------(I)
{
}
//事件b
}
private void timer1_Tick(object sender, System.EventArgs e)
{
timer1.Stop();
DelayFlag = 1;
}
上面的程序本来是想在做了事情a之后需等待500ms后再去做事情b,可是结果是(I)语句while循环一直运行,到了500毫秒后也不会执行timer1_Tick事件,该事件会处在一直等待状态,整个程序会一直在while循环中。
原因分析及解决方案:
在C#里关于定时器类有3个:System.Windows.Forms.Timer类、System.Threading.Timer类和System.Timers.Timer类。
System.Windows.Forms.Timer是应用于WinForm中的(也就是我们在工具箱中拖到窗体中的控件),它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。
System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现轻量、精确的计时,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。
所以要实现延时后继续执行的功能,案例代码如下:
public partial class Form1 : Form
{
System.Timers.Timer tmr_DelayMs = new System.Timers.Timer();
byte DelayFinishFlag == 0;
...
private void DelayTest()
{
tmr_DelayMs.Elapsed += new ElapsedEventHandler(tmr_Elapsed); //这个看加在哪里合适加哪里
//处理事情a
tmr_DelayMs.Interval = 500;
tmr_DelayMs.Start();
serialPort1.Write(Cmd_Read_Block, 0, Cmd_Read_Block[1]);
while (DelayFinishFlag == 0)
{
}
//处理事情b
}
private void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
tmr_DelayMs.Stop();
DelayFinishFlag = 1;
}
...
}