开发环境:Visual Studio .NET 2003
语言:C#
创建的是Windows Services程序(这个应该不太重要)现在使用一个Timer组件,比如设定Interval属性为20000(2秒)
然后在对应的Elapsed()方法中加入执行操作的代码问题是:如果2秒的时间内没有执行完相应的代码,程序默认怎样处理?
或者能不能添加相应的判断,如果没执行完继续执行之类的?非常感谢
语言:C#
创建的是Windows Services程序(这个应该不太重要)现在使用一个Timer组件,比如设定Interval属性为20000(2秒)
然后在对应的Elapsed()方法中加入执行操作的代码问题是:如果2秒的时间内没有执行完相应的代码,程序默认怎样处理?
或者能不能添加相应的判断,如果没执行完继续执行之类的?非常感谢
(应该为20秒 楼上写错了)
{
//可以执行 flag=true;
执行代码开始
.....
执行完了,flag=false;}
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
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的失效如果是这种情况,解决的方法就是,如果发现线程多于一定数量,延长时钟间隔,或暂停时钟。
Timer.Enabled=true;
如果使用System.Timers的Timer,那你可以这样
Timer.Enable = false;
try {
...
} finally {
Timer.Enable = true;
}