我有一个 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);
以下是在事件处理程序成功或失败时重置计时器的代码。NOTE计时器没有停止,
只是 Interval 属性被重置。
if (ProcessSuccess)
{
Timer.Interval = TimeSpan.FromHours(24).TotalMilliseconds;
}
else
{
Timer.Interval = TimeSpan.FromMinutes(15).TotalMilliseconds;
}
我的问题是,如果进程失败 4 次,那么成功后计时器现在会在凌晨 3 点左右运行吗?
即失败后,原定的凌晨 2 点开始时间是否会提前 15 分钟?
我鼓励你下载反射器 http://www.red-gate.com/products/reflector/,您会找到此类问题的快速答案。计时器的间隔由 TimerBase.ChangeTimer() 更改。采取多种措施来保证间隔更新的安全性和准确性。该代码在finally 块中运行,因此即使出现ThreadAbortException 也不会弄乱它。它获取一个锁(m_lock 成员)以确保跨线程访问串行化。 ChangeTimerNative() 调用调用 CLR 来更新本机计时器。该方法由 TimerNative::CorChangeTimer() 实现,它调用 ChangeTimerQueueTimer() Windows API 函数。该函数被记录为安全的,即使从 Elapsed 回调函数内部调用也是如此。
长话短说,是的:它具有您正在寻找的行为。但请注意不可避免的竞争条件,计时器可能已经过去,并且进行回调的线程池线程可能已计划运行但尚未有机会运行。获取回调立即地改变定时器后也不是不可能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)