假设我们有一个计时器,它每10分钟运行一次。如果它的处理周期超过10分钟怎么办?一个新的线程会为此启动吗?它会中断当前的操作吗?如果一个对象在计时器中发生了变化怎么办?
抱歉,如果我没有提到任何代码,因为问题很明显,而且我想从多线程编程极客的角度知道完整的答案,而不是通过尝试通过示例应用程序测试来找到一个松散的答案。实际上,我想知道它的工作机制背后的逻辑。
发布于 2012-05-06 22:38:07
如果您使用的是System.Threading.Timer或System.Timers.Timer,则计时器将再次滴答作响,启动一个新线程。有关避免该问题的方法,请参阅https://stackoverflow.com/a/10442117/56778。
如果您使用的是System.Windows.Forms.Timer,那么在前一个完成处理之前,不会出现新的记号。
发布于 2012-05-07 05:21:29
将您的代码放在Monitor.TryEnter()中
object timeCheck= new object();
void Timer()
{
Monitor.TryEnter(timeCheck)
{
//Code that might take too long
//...
Monitor.Exit();
}
}发布于 2012-05-06 22:58:47
为了防止重入,您可以使用一个静态布尔值来告知函数是否已准备好执行。使用try/Catch/finally并在finally中将此布尔值设置为false,以确保如果代码中出现错误或代码失败,布尔值不会保持为false。
对于更快的计时器,应该使用信号量(互斥)来防止重入。
https://stackoverflow.com/questions/10471315
复制相似问题