如果计时器无法在新周期时间到来之前完成所有工作怎么办?

本文关键字:怎么办 工作 时间 计时器 新周期 周期 如果 | 更新日期: 2023-09-27 18:33:17

假设我们有一个每10分钟运行一次的计时器。如果其处理周期超过 10 分钟怎么办。新线程是否为此启动?它会中断其当前操作吗?如果单个物体在计时器内发生突变怎么办?

抱歉,如果我没有为此提及任何代码,因为问题很清楚,而且我想从多线程编程极客的角度知道完整的答案,而不是通过尝试通过示例应用程序进行测试来找到松散的答案。实际上,我想知道其工作机制背后的逻辑。

如果计时器无法在新周期时间到来之前完成所有工作怎么办?

如果您使用的是System.Threading.TimerSystem.Timers.Timer,计时器将再次滴答作响,开始一个新线程。请参阅 https://stackoverflow.com/a/10442117/56778,了解避免该问题的方法。

如果您使用的是 System.Windows.Forms.Timer ,则在前一个刻度完成处理之前,不会出现新的刻度。

把你的代码放在一个Monitor.TryEnter()

object timeCheck= new object();
void Timer()
{
    Monitor.TryEnter(timeCheck) 
    {
        //Code that might take too long 
        //...
        Monitor.Exit();
    }
}

为了防止重入,您可以使用静态布尔值来告诉函数是否已执行 allready beeing。用户 try/Catch/finally 并在 finally 中将此布尔值设置为 false,以确保在代码中出错或代码失败时布尔值不会保持 false。
为了获得更快的计时器,应使用信号量(互斥锁)来防止重入。