日期:2014-05-17  浏览次数:20873 次

关于定时器的疑惑,求解。
假设一个定时器的时间间隔是1秒。有个全局变量test,定时器的代码如下:


if(test == false)
{
//假设做事情1,耗时0.1秒。
}
if(test == true)
{
test = false;
//假设做事情2,耗时15秒。
}


我想求解的是:在某个情况下,test==true时,这个定时器在做耗时15秒的事情2,只做了1秒的时候,
定时器又开始下一次执行了,这个时候test==false,那么这个定时器在做事情1的时候,前1秒还在做的
事情2是被打断了不执行,还是仍旧可以继续执行一直到执行完事情2呢?如果是仍旧可以继续执行,那么这个定时器就是执行了两个线程是吗?(一个线程做15秒的事情2,一个线程做0.1秒的事情1)。

我最想知道的是这个15秒的事情2是不是被打断了?


------解决方案--------------------
这个问题还真复杂,我还真不太清楚,

我知道的,C#里有三种TIMER,他们的执行方式是不同的,FROM下TIMER是用窗体所在线程去执行的,如果这个线程在执行着事件2,就算时间到了一秒,我想还是这个线程的,应该不会转去执行事件1吧,除非,时间到了保存断点再去做另一个,然后就是一个人同时做两件事的样子,具休不太清楚是哪种

线程级的TIMER和系统下的TIMER是用后台线程去执行的,每到时间都会从线程里重启一个线程去执行,这样如果启动去执行事件2的线程还没执行完,就会一直执行着,到时启动的事件1会用其他的线程去执行的
------解决方案--------------------
我最想知道的是这个15秒的事情2是不是被打断了?
- 一定不会被自动打断。

如果是仍旧可以继续执行,那么这个定时器就是执行了两个线程是吗?
- 这个取决于用了什么定时器。
a. 如果是System.Windows.Form.Timer,那么定时器事件就要排队(最多只能有一个定时器事件排队,多余的就被忽略了,倒是没有积压的担忧),只有前一个处理完毕后,排队的定时器事件才有机会得到执行。
b. 如果是其他定时器,比如System.Threading.Timer。那么,每个定时事件都独立在线程池上执行,会有两个线程。
------解决方案--------------------
1. .NET 提供了三种Timer:除了楼上所说的System.Threading.Timer、System.Windows.Forms.Timer外,还有一个System.Timers.Timer,楼主想解决这个问题,可以先了解一下三者的区别。

2.接楼上,补充说明一下,System.Timers.Timer这个定时器基本上是对System.Threading.Timer类的包装,当定时器时间到期后,将导致CLR将事件加入线程池的队列。

3.对于你碰见的问题,可以设置一个标志位来标识timer正在执行。