0

タイマー(スレッド)がタスクの再実行の待機期間の前にタスクの実行を終了するかどうか疑問に思っていますか?

4

2 に答える 2

4

System.Threading.Timerの備考を参照してください。

タイマーによって実行されるコールバックメソッドは、ThreadPoolスレッドで呼び出されるため、再入可能である必要があります。タイマー間隔がコールバックの実行に必要な時間より短い場合、またはすべてのスレッドプールスレッドが使用中であり、コールバックが複数回キューに入れられている場合、コールバックは2つのスレッドプールスレッドで同時に実行できます。

したがって、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 );
    }
}

前のティックがまだ実行されている間にタイマーが再度ティックすると、新しいティックは黙って無視されます。

于 2013-01-08T15:39:31.787 に答える