56

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

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

4

3 回答 3

58

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

如果您正在使用System.Windows.Forms.Timer,则在前一个完成处理之前不会发生新的滴答声。

于 2012-05-06T14:38:06.977 回答
3

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

object timeCheck= new object();

void Timer()
{
    Monitor.TryEnter(timeCheck) 
    {
        //Code that might take too long 
        //...
        Monitor.Exit();
    }
}
于 2012-05-06T21:21:29.397 回答
1

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

于 2012-05-06T14:58:47.217 回答