开发环境:Visual Studio .NET 2003
语言:C#
创建的是Windows Services程序(这个应该不太重要)现在使用一个Timer组件,比如设定Interval属性为20000(2秒)
然后在对应的Elapsed()方法中加入执行操作的代码问题是:如果2秒的时间内没有执行完相应的代码,程序默认怎样处理?
或者能不能添加相应的判断,如果没执行完继续执行之类的?非常感谢

解决方案 »

  1.   

    比如设定Interval属性为20000
    (应该为20秒 楼上写错了) 
      

  2.   

    Timer中每一次启动的是一个新的线程那就在Timer的Elapsed执行Timer.Enabled=false;等执行完了再Timer.Enabled =true;或者加一个其它的开关如flag=false,公共变量做为控制,开始执行时,判断如果if(flag==false)
    {
    //可以执行  flag=true; 
      
    执行代码开始
    .....
      执行完了,flag=false;} 
      

  3.   


    Private over As Boolean = True
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If over Then
                over = False
                'Do something
                over = True
            End If
        End Sub
      

  4.   

    不用加判断。上一次没执行完的话下一个Elapsed()不会触发可以试验一下。把timer的interval设为1000,Elapsed()方法写Console.WriteLine("running");Thread.Sleep(2000);
      

  5.   

    sorry,我错了。这段话只适用于System.Windows.Forms.Timer而System.Timers.Timer是要加判断的
      

  6.   

    Timer有三个:
    System.Timers.Timer
    System.Threading.Timer
    System.Windows.Forms.Timer
    其中Windows.Forms.Timer类似Win32 Timer,它发送WM_TIMER到所在线程的窗口。由于窗口消息处理本身是同步的,
    所以不会出现重入(同时有两个线程执行同一段代码)的问题。不是每一个WM_TIMER都会得到响应,如果来不及处理,WM_TIMER消息可以被丢弃。
    象Timer1_Tick(object sender, EventArgs e){}是安全的,不用考虑自身的同步的。System.Timers.Timer基本上封装了System.Threading.Timer,只不过它多继承了IComponent,所以可以被拉到设计窗口。
    搂主用了Elasped,所以这个Timer因该是System.Timers中的Timer。由于System.Timers.Timer和System.Threading.Timer大致相同,以下只讲System.Threading.Timer,也适用于System.Timers.Timer。System.Threading.Timer在时钟到点的时候,会取出线程池的线程来运行你的回调函数-使用ThreadPool.QueueUserWorkItem()。所以,可以有多个线程同时运行你的回调函数。这本身并没有问题,也不会搞死你的程序。不过,如果你的回调函数用到了共享的数据,回调函数本身必须做好同步。会不会由于来不及执行导致产生太多的线程呢?答案是不会的。线程池有个最多线程数量的限制,一般是20个(可以设置)。如果超过了该数量,新的WorkItem就要排队等。不过,如果排队的人实在太多了,会导致调用QueuUserWorkItem失败,并导致Timer的失效如果是这种情况,解决的方法就是,如果发现线程多于一定数量,延长时钟间隔,或暂停时钟。
      

  7.   

    Timer.Enabled=false;
    Timer.Enabled=true;
      

  8.   

    如果使用的是System.Windows.Form里面的Timer控件,那么不用处理,执行不完的话继续执行,后面的Timer事件将丢失。
    如果使用System.Timers的Timer,那你可以这样
    Timer.Enable = false;
    try {
    ...
    } finally {
      Timer.Enable = true;
    }