C# Timer

基本用法:

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)
         {
         }
         //处理事情bprivate void tmr_Elapsed(object sender, ElapsedEventArgs e)
    {
        tmr_DelayMs.Stop();
        DelayFinishFlag = 1;
    }
    ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值