我使用的System.Timers.Timer
功能设置为Elapsed。
' aTimer.Elapsed + = OnTimedEvent`设置为定期定时触发。
让我们说这种情况每5秒发生一次。
如果由于某种原因OnTimedEvent的处理持续超过 5秒,会发生什么。
根据文档,*可能会在另一个ThreadPool线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。*
虽然我从理论上理解这一点,但有人可以用更简单实用的方式向我解释这个吗?
如果它对我的onTimedEvent有帮助,我试图从NetworkStream中读取。
答案 0 :(得分:2)
简单来说,它意味着:OnTimedEvent应该能够支持同时通过它的多个线程。为什么?因为在您的方法执行时,如果您没有停止计时器,它将在5秒内再次触发。但是这次它将在另一个线程上触发,因为第一个线程忙于执行第一个调用。因此,第二个线程将进入该方法。此时,如果OnTimedEvent不是线程安全的,那么可能会发生不好的事情。
您可以更多地了解如何支持多个线程,您应该能够找到大量信息。
大多数情况下,人们在方法执行时停止计时器,然后在方法结束时重新启动计时器。但这取决于您的要求以及您正在做的事情。
以下是非重入方法的示例:
static int sum = 0;
int increment(int i) {
sum += i;
return sum;
}
它不是可重入的,因为如果T1在执行它的方法内部并且向和加1,则sum将变为1.如果它被中断,则表示此时执行控制并且给予T2,当T2到达时sum的值不是0但是1.T2将加1加1并返回2.当T1返回时,它将从它停止的地方继续,即它已经完成加法所以它将返回1.因此剩下的2个线程结果不同:T1为1,T2为2.因此,该方法不可重入。
为了让它重新进入,我们只需这样做:
int increment(int sum, int i)
{
return sum + i;
}
现在每个线程将返回相同的答案,即使它们在方法执行的中间离开,因为所有变量都在堆栈上而不是由线程共享(每个线程都有自己的变量副本)。 / p>
This如果您想了解更多内容,那么答案有很多信息和解释。