.net 间隔属性更改时系统计时器的行为
我有一个系统计时器设置,每天凌晨2点触发一个事件。 如果计时器启动的过程失败,那么我需要计时器 重置为每15分钟运行一次,直到流程成功完成.net 间隔属性更改时系统计时器的行为,.net,timer,.net,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); 下面是在事件处理程序成功或失败
// 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点左右运行吗?
i、 e.失败后,最初的凌晨2点开始时间会提前15分钟吗?我鼓励您这样做,您会找到这样一个问题的快速答案。计时器的间隔由TimerBase.ChangeTimer()更改。它采取了多种措施来确保间隔更新的安全性和准确性。代码在finally块中运行,因此即使是ThreadAbortException也不能将其弄糟。它获取一个锁(m_lock成员),以确保跨线程序列化访问。changeTimerActive()调用调用CLR以更新本机计时器。该方法由TimerActive::CorChangeTimer()实现,它调用ChangeTimerQueueTimer()Windows API函数。该函数被证明是安全的,即使在从已用回调函数内部调用时也是如此
长话短说,是的:它有你想要的行为。但是要注意不可避免的竞争条件,计时器可能已经过了,进行回调的线程池线程可能已经被安排运行,但还没有机会运行。更改计时器后立即获取回调并非不可能。在将来的实现中可能值得一看。我总是喜欢查看当前可以重用的现有库,而不是编写自己的库