假设我们有一个每 10 分钟运行一次的计时器。如果它的处理周期需要超过 10 分钟怎么办。是否会为此启动一个新线程?它会中断当前的操作吗?如果单个对象在计时器内发生变异怎么办?
抱歉,如果我没有提及任何代码,因为问题很清楚,而且我想从多线程编程极客的角度了解完整的答案,而不是通过尝试通过示例应用程序对其进行测试来找到松散的答案。其实我想知道它的工作机制背后的逻辑。
假设我们有一个每 10 分钟运行一次的计时器。如果它的处理周期需要超过 10 分钟怎么办。是否会为此启动一个新线程?它会中断当前的操作吗?如果单个对象在计时器内发生变异怎么办?
抱歉,如果我没有提及任何代码,因为问题很清楚,而且我想从多线程编程极客的角度了解完整的答案,而不是通过尝试通过示例应用程序对其进行测试来找到松散的答案。其实我想知道它的工作机制背后的逻辑。
如果您使用System.Threading.Timer
or System.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();
}
}
为了防止重入,你可以使用一个静态布尔值来告诉函数是否已经被执行。使用 try/Catch/finally 并在 finally 中将此布尔值设置为 false,以确保如果您在代码中出错或代码失败,布尔值不会保持为 false。
对于更快的计时器,应通过使用信号量(互斥量)来防止重入。