定时器(多次调用经过的功能)

时间:2016-11-21 01:35:32

标签: c# timer reentrancy

我使用的System.Timers.Timer功能设置为Elapsed。 ' aTimer.Elapsed + = OnTimedEvent`设置为定期定时触发。 让我们说这种情况每5秒发生一次。

如果由于某种原因OnTimedEvent的处理持续超过 5秒,会发生什么。

根据文档,*可能会在另一个ThreadPool线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。*

虽然我从理论上理解这一点,但有人可以用更简单实用的方式向我解释这个吗?

如果它对我的onTimedEvent有帮助,我试图从NetworkStream中读取。

1 个答案:

答案 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如果您想了解更多内容,那么答案有很多信息和解释。