日期:2014-05-19  浏览次数:20787 次

关于定时执行的问题
我在服务里设了个Timer,每隔30秒扫描一次.我第一次的数据执行时间可能会超过30秒,而30秒后Timer又执行了,请问如何把上一次的进行结束掉.我发现Timer是多线程的,每次的一个反复都重开一个线程,是这样吗?

------解决方案--------------------
我发现Timer是多线程的,每次的一个反复都重开一个线程,是这样吗?
______________________________________________________________

服务器常用的Timer都是多线程的,其线程是从本进程的线程池中取出了一个. 但是要强制关掉它恐怕不是好方法,第一不容易拿到线程池中的那个线程,第二在它扫描一半的时候终止可能会产生不可预料的结果.

我们自己碰到这种情况是先检查前一个Timer结束了没有,如果还没有,这个Timer就什么也不做,自动结束,再等下一次Timer触发.
------解决方案--------------------
是多线程,解决这样的问题,加个判断就好了

private bool m_IsWorking = false;

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (m_IsWorking)
return;

m_IsWorking = true;
// 开始调用方法
workAsynchronism();
m_IsWorking = false;
}