.net里面,timer触发以后,是自动开一个新的线程去做的吗?

解决方案 »

  1.   

    如果是用的Timer控件,是在主线程执行处理函数的,那么在第一次执行完方法F()前,
    应该会阻塞,不会执行第二次的方法F。如果是启动子线程去执行方法F,那么就会是混合执行了。
      

  2.   

    timer触发以后还是在主界面的那个线程做的,不会开一个新的线程的
      

  3.   

    声明一下,我用的是System.Timers.Timer。
    到底是第一个执行完了以后再执行第二个,还是第一个和第二个混合在一起执行啊?
      

  4.   

    我用Timer控件测试的,是混合在一起执行的
      

  5.   

    如果真的这样 我可以用lock解决。
      

  6.   

    MSDN
    System.Timers.Timer的说明有这么一段:“Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。”
    具体请参考:
    http://msdn.microsoft.com/zh-cn/library/system.timers.timer(VS.80).aspx
      

  7.   

    可重入是什么意思?是不是前后两次触发会混在一起执行?
    执行的时候lock一下,就可以让两次触发有先后顺序了。不晓得这个方法怎么样?
      

  8.   

    你用System.Timers.Timer的话,可以通过在进入方法时,设置Enable属性为false,方法结束时再设置Enable属性为true
    timer_Elapsed(.....)
    {
         timer.Enable=false;
         .....
         timer.Enable=true;
    }
      

  9.   

    你这个不好,时间间隔其实不是固定的了。我的方法:
    timer_Elapsed(.....)
    {
        lock(o)
        {
            //...
        }
    }
    请大家评价。
      

  10.   

    间隔其实不是固定的,那有什么关系?设置为false了。等到所以的方法走完了,才为true。这个时候才有下一次的事件执行。这样是正确的
      

  11.   

    会两个一起执行。这样就不会了            try  
                {   
                    if ( TimeIsUp )   
                    {   
                        SysTimer.Change( Timeout.Infinite, this.Config.ChkInterval );   
      
                        //开始处理服务   
                        this.StartService();   
                    }   
                }   
                catch ( Exception ex ) { }   
                finally  
                {   
                    if ( SysTimer != null )   
                    { 
                        SysTimer.Change( this.Config.ChkInterval, this.Config.ChkInterval );
                    }   
                }   
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Linux7985/archive/2010/01/10/5169375.aspx
      

  12.   

    用Timer时一定需要考虑到并发的问题,对临界区资源的访问一定需要加以控制.
    可以用Mutex,Monitor等对象来控制
      

  13.   

    在开始执行F()前,先停止Timer,然后执行完成后,再开始执行Timer
      

  14.   

    我是这样用的,事件开始设Enable为false,并计算运行的总时长,如果时长超过预定的interval,则将interval设得很小,否则将interval设为预定interval-总时长
      

  15.   

    还是会顺次执行,但是执行的时间将延后,不会立刻触发要执行的事件,会放在队列里等待,当然此刻单个CPU肯定满负荷运行的。所以你还是在执行一个事件时将计时器停止,完了再开启,或者时间间隔长一点。