winXP + vs2005 + winform环境。
假设界面用了一个名为Timer1定时器,其Interval为500(即半秒钟),如果在Timer1_Tick()的多条代码中其中用了一条System.Threading.Thread.Sleep(2000);这样的语句,我想知道会发生何种情况。因为这条语句是延时两秒钟,而定时器本身的触发周期才半秒。请各位高手给解答解答,谢谢。

解决方案 »

  1.   

    我知道定时器其实就是开了一个新线程。另外,长延时语句是否可以放在短Interval的定时器的_Tick()呢?是不是不太好?
      

  2.   

    会不会出现两秒钟还未延时结束又触发新的定时器的_Tick()开始新的两秒钟延时,以至于延时没完没了?
      

  3.   

    楼主,怎么这么懒!
     自已试就知了。
     
    我可以明确告诉你:

      timer 是计时,是通过计算机系统的时间差的。
      实际上,主线程sleep 了,就放弃了主动权,就算计算机到了时间,也无法触发tick事件。tick事件是主线程的,tick 中如有sleep function 也会打断主线程。
      结果,不用我说了吧, 当2秒后,主线程得到控制权时,发现自已的定时器已超时,马上响应。
    时间t > 2000毫秒。大约是2001 毫秒!
      
      

  4.   

    //我也是初学者,明白初学者之不易,
     //就贴出我的代码吧!
    public Timer t;
    public Stopwatch sw;private void Button1_Click(object sender, EventArgs e)
    {
    if (sw == null)
    {
    sw = new Stopwatch();
    }
    if (t == null)
    {
    t = new Timer();
    t.Interval = 500;
    t.Tick += new EventHandler(t_Tick);
    }
    t.Start();
    sw.Reset();//时
    sw.Start();
    System.Threading.Thread.Sleep(2000);
    }
    void t_Tick(object sender, EventArgs e)
    {
    t.Stop();
    sw.Stop();
    MessageBox.Show("0.5定时器,实际时间是:" + sw.ElapsedMilliseconds.ToString() + "毫秒", "Information");
    }
      

  5.   

    using System.Threading;Thread.Sleep(9000);实在不行用线程休眠像上面的代码那样
      

  6.   

    可以这样理解吗:就是无论定时器的Interval的值是多少,触发Timer_Tick()后只要碰到类似System.Threading.Thread.Sleep(XXXX);这样的语句,一定会延时所指定的时间,退出Timer_Tick()后只要延时时间大于Interval就会触发下一次的Timer_Tick()代码。
      

  7.   

    那是当然!
       只要 你的理解与运行结果相一致,谁敢说你的理解是错的。--果有人这么说,这个人就是太自负了!
    也只有经过自已主观的理解,自已的技术才会提升!所以, 每个人的思维不同,每个人的大脑最灵活的地方(开发最好之处)不同。
      他人的理解不一定适合自已的,so 以运算结果为基准 + 自已的主观理解 ===  好处最大化!
    相信自已,绝对OK!
      

  8.   

    Forms.Timer是靠消息实现的,所以会延迟2s