2012-11-07 11 views
7

Eventuali duplicati:
Synchronizing a timer to prevent overlapCome mettere in pausa un Threading.Timer per completare una funzione

Ho un Threading.Timer nella mia classe.

System.Threading.Timer timer; 
TimerCallback cb = new TimerCallback(ProcessTimerEvent); 
timer = new Timer(cb, reset, 1000, Convert.ToInt64(this.Interval.TotalSeconds)); 

e definito un callback per esso.

private void ProcessTimerEvent(object obj) 
{ 
    if(value) 
    MyFunction(); 
} 

Quando eseguirlo, ri-esecuzione di callback prima myfunction per completare.

Come sospendere Threading.Timer per completare myfunction?

+0

Penso che si desidera impedire [sovrapposizione timer] (http://stackoverflow.com/questions/684200/synchronizing-a-timer-to-prevent-overlap). –

risposta

14

Non è necessario interrompere il timer, è possibile lasciare che il timer continui a attivare il metodo di richiamata, ma avvolgere il codice non rientrante in Monitor.TryEnter/Exit. In questo caso non è necessario arrestare/riavviare il timer; le chiamate sovrapposte non acquisiranno il blocco e torneranno immediatamente.

object lockObject = new object(); 

private void ProcessTimerEvent(object state) 
{ 
    if (Monitor.TryEnter(lockObject)) 
    { 
    try 
    { 
     // Work here 
    } 
    finally 
    { 
     Monitor.Exit(lockObject); 
    } 
    } 
} 
+0

+1 Bella soluzione. –

6

È possibile disabilitare un System.Threading.Timer modificando l'intervallo. È possibile farlo chiamando:

timer.Change(Timeout.Infinite, Timeout.Infinite); 

Dovrete modificare l'intervallo indietro una volta che hai finito chiamando myfunction se si desidera che il timer di continuare a sparare di nuovo.

Problemi correlati