在重新执行任务的等待期之前,Timer(线程)是否会完成任务?

时间:2013-01-08 15:24:19

标签: c# multithreading timer

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

2 个答案:

答案 0 :(得分:4)

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

  

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

因此,对于System.Threading.Timer,答案是否为。

答案 1 :(得分: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 );
    }
}

如果计时器在前一个刻度线仍在运行时再次打勾,则会默默忽略新的刻度。