假设我们有它运行,每10分钟的计时器。 如果它的循环处理时间超过10分钟。 难道一个新的线程开始是什么? 它会中断目前的操作? 如果有什么单一的对象是在计时器内突变?
很抱歉,如果我不提了,任何代码,因为这个问题是清楚的,也是我想知道从多线程编程怪胎的角度来看,完整的答案,而不是试图通过一个示例应用程序来测试它找到一个松散的答案。 其实,我想知道它背后的工作机制的逻辑。
假设我们有它运行,每10分钟的计时器。 如果它的循环处理时间超过10分钟。 难道一个新的线程开始是什么? 它会中断目前的操作? 如果有什么单一的对象是在计时器内突变?
很抱歉,如果我不提了,任何代码,因为这个问题是清楚的,也是我想知道从多线程编程怪胎的角度来看,完整的答案,而不是试图通过一个示例应用程序来测试它找到一个松散的答案。 其实,我想知道它背后的工作机制的逻辑。
如果您使用System.Threading.Timer
或者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();
}
}
防止重入,您可以使用一个静态布尔告诉阉的媒体链接beeing执行的功能。 用户一个try / catch /终于和设置这个布尔假的最后,以确保布尔不留假的,如果你的代码,或者如果代码失败犯了一个错误。
对于更快的计时器,重入应通过使用信号量(互斥)来防止。