0

只是想知道计时器(线程)是否会在任务重新执行的等待期之前完成执行他的任务?

4

2 回答 2

4

请参阅System.Threading.Timer中的备注:

定时器执行的回调方法应该是可重入的,因为它是在 ThreadPool 线程上调用的。如果计时器间隔小于执行回调所需的时间,或者如果所有线程池线程都在使用并且回调多次排队,则可以在两个线程池线程上同时执行回调。

所以对于 System.Threading.Timer 答案是否定的。

于 2013-01-08T15:29:17.153 回答
4

正如@Clemens 所说,System.Threading.Timer继续滴答作响!

如果你想防止重入,你可以使用一个Monitor,或者只是一个像这样的标志:

int _TimerLock = 0;

void TimerTickSafe( object state )
{
    if ( Interlocked.CompareExchange( ref _TimerLock, 1, 0 ) != 0 ) return;
    try
    {
        TimerTick();
    }
    finally
    {
        Interlocked.Exchange( ref _TimerLock, 0 );
    }
}

If the timer ticks again while the previous tick is still running, the new tick will be silently ignored.

于 2013-01-08T15:39:31.787 回答