Interval属性更改时System.Timer的行为

时间:2010-05-05 09:49:54

标签: .net timer

我有一个System.Timer设置,每天凌晨2点触发一个事件。 如果计时器启动过程失败,那么我想要计时器 重置为每15分钟运行一次,直到该过程成功完成。

// this is how the timer is set up. 
// this is working correctly.

double startTime = milliseconds_of_hour_to_start.

Timer = new System.Timers.Timer( startTime);

以下是在事件处理程序成功或失败时重置计时器的代码。 注意计时器未停止, 只是正在重置Interval属性。

if (ProcessSuccess)
{
  Timer.Interval = TimeSpan.FromHours(24).TotalMilliseconds;
}
else
{
  Timer.Interval = TimeSpan.FromMinutes(15).TotalMilliseconds;
}

我的问题是,如果过程失败了4次,那么成功的定时器现在会在凌晨3点左右运行吗? 即失败后,2AM的原始开始时间将提前15分钟?

1 个答案:

答案 0 :(得分:2)

我鼓励你download Reflector,你会找到这样一个问题的快速回答。计时器的间隔由TimerBase.ChangeTimer()更改。需要采取多种措施来确保间隔更新的安全性和准确性。代码在finally块中运行,因此即使ThreadAbortException也不会搞砸它。它获取一个锁(m_lock成员)以确保跨线程序列化访问。 ChangeTimerNative()调用调用CLR来更新本机计时器。该方法由TimerNative :: CorChangeTimer()实现,它调用ChangeTimerQueueTimer()Windows API函数。即使从Elapsed回调函数内部调用,该函数也被记录为安全。

长话短说,是的:它有你想要的行为。但要注意不可避免的竞争条件,计时器可能已经过去了,并且使得回调的线程池线程可能已经被安排运行但是还没有机会运行。

。更改定时器后立即获取回调