我看帮助文档说这个是单线程的,但我下面试验有些不解。试验一:我timer1的Interval设为500   private void timer1_Tick(object sender, EventArgs e)
        {       
           
            MessageBox.Show("test");            Thread.Sleep(2000);
        }如果是单线程的,当弹出第一个"test"后,由于Thread.Sleep(2000);的阻塞,
第二个对话框应至少2秒后才能弹出,但实际上Thread.Sleep(2000);这一句加与没加的效果相同,都是500毫秒弹出一次"test"。感觉就像多线程的。可是当我改成下面后试验二:   private void timer1_Tick(object sender, EventArgs e)
        {
        
           Thread.Sleep(2000);
            MessageBox.Show("test");
            
        }"test"并没弹出,而是出现窗口卡住了,这又是怎么回事呢(我用断点也不能拦到)
谢谢!

解决方案 »

  1.   

    e 有timer的多线程版本。楼主注意查一下资料。
      

  2.   

    System.Windows.Forms.Timer 500ms向窗体发送一次消息,时间间隔不精确。private void timer1_Tick(object sender, EventArgs e) 
    {      
         MessageBox.Show("test"); //系统响应messagebox消息,500ms一次
         Thread.Sleep(2000);  //UI线程等待。
    } private void timer1_Tick(object sender, EventArgs e) 

        Thread.Sleep(2000); //UI线程等待。
        MessageBox.Show("test");   //系统响应messagebox消息,2000ms一次。由于timer500ms向窗体发送一次消息,会有部分消息丢失。
              

      

  3.   

    VS2005里面,好像是,到了VS2008,好像就不是了我也很晕了。
    不过不管是不是,你都应该用多线程的方式进行回答,
    Control.Invoke~
      

  4.   

    TO:softlove03private void timer1_Tick(object sender, EventArgs e) 
    {      
        MessageBox.Show("test"); //系统响应messagebox消息,500ms一次 
        Thread.Sleep(2000);  //UI线程等待。 

    是不是得这样理解,Thread.Sleep(2000);  没有阻止timer500ms触发一次的事实?
    如果是多线程很好理解,可是单线程的,timer的第二次难道不用等Thread.Sleep(2000); 执行完吗?
    谢谢!
      

  5.   

    我的目的是作一个任务计划执行程序。timer每n秒解发一次,但任务里执行的总时间大于timer的间隔。
    也就是说我要保证每个任务完整的执行完,timer才能再次触发。
    我用System.Windows.Forms.Timer就是看中他的单线程式,可是试验后,我任务还没执行完,timer就触发了(也就成了多线程了)。请问如何解决。谢谢!
      

  6.   

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick        Timer1.Enabled = False        ''具体任务执行函数
            fncMethod()
            Timer1.Enabled = True
        End Sub这样MS 可以解决你说的问题
      

  7.   

    首先肯定是是单线程的
     winform的timer应该基于消息的。第一种情况:messagebox也是窗体,弹出MessageBox后,消息由Messagebox处理函数处理,这时timer的到时消息传送过来,messagebox又会调用timer1_Tick,又一个messagebox产生,而且消息又转交给它,又产生一个messagbox,如此反复,所以sleep 也根本不会运行到。
    第二种情况其实也一样:只不过ui线程sleep时 , 窗体失去响应,2000ms应该是太长了,还没等刷新界面,又sleep了,设的短点,应该可以看到messagebox。
      

  8.   

    楼主,其实按照你的想法,应该可以利用System.Windows.Forms.Timer的单线程式实现。
    你可以设一个布尔型变量,该变量标识任务是否执行完毕。然后在timer的触发事件中判断,如果任务执行完毕,就开始执行下一个事件;若没有,就不执行。这样不就可以了?