Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 间隔属性更改时系统计时器的行为_.net_Timer - Fatal编程技术网

.net 间隔属性更改时系统计时器的行为

.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); 下面是在事件处理程序成功或失败

我有一个系统计时器设置,每天凌晨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点左右运行吗? i、 e.失败后,最初的凌晨2点开始时间会提前15分钟吗?

我鼓励您这样做,您会找到这样一个问题的快速答案。计时器的间隔由TimerBase.ChangeTimer()更改。它采取了多种措施来确保间隔更新的安全性和准确性。代码在finally块中运行,因此即使是ThreadAbortException也不能将其弄糟。它获取一个锁(m_lock成员),以确保跨线程序列化访问。changeTimerActive()调用调用CLR以更新本机计时器。该方法由TimerActive::CorChangeTimer()实现,它调用ChangeTimerQueueTimer()Windows API函数。该函数被证明是安全的,即使在从已用回调函数内部调用时也是如此

长话短说,是的:它有你想要的行为。但是要注意不可避免的竞争条件,计时器可能已经过了,进行回调的线程池线程可能已经被安排运行,但还没有机会运行。更改计时器后立即获取回调并非不可能。

在将来的实现中可能值得一看。我总是喜欢查看当前可以重用的现有库,而不是编写自己的库