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

假设我们有一个每10分钟运行一次的计时器。 如果处理周期超过10分钟,会怎么样? 新线程是否启动了? 它会中断当前的操作吗? 如果一个对象在定时器内发生了变异呢?

对不起,如果我没有提到任何代码,因为问题是清楚的,我也想知道从multithreading编程极客的angular度来看完整的答案,而不是find一个松散的答案,试图通过示例应用程序来testing它。 其实我想知道其工作机制的逻辑。

如果您使用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(); } } 

为了防止重入,你可以使用一个静态布尔值来告诉这个函数是否已经被执行。 用户try / Catch / finally并在terminal中将此布尔值设置为false,以确保如果代码中出现错误或者代码失败,布尔值不会保持为false。
对于更快的定时器,应该通过使用信号量(互斥体)来防止重入。