2012-11-07 12 views
7

Mögliche Duplizieren abzuschließen:
Synchronizing a timer to prevent overlapWie ein Threading.timer pausieren eine Funktion

Ich habe eine Threading.Timer in meiner Klasse.

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

und einen Rückruf dafür definiert.

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

Wenn es läuft, Wiedercallback vor myfunction abzuschließen.

Wie pausieren Sie Threading.Timer, um myfunction abzuschließen?

+0

Ich glaube, du [Timer Überlappung] verhindern wollen (http://stackoverflow.com/questions/684200/synchronizing-a-timer-to-prevent-overlap). –

Antwort

14

Es ist nicht notwendig, den Timer zu stoppen, Sie könnten den Timer weiter die Callback-Methode auslösen lassen, aber Ihren nicht-reentranten Code in einen Monitor.TryEnter/Exit einbinden. In diesem Fall muss der Timer nicht gestoppt/neu gestartet werden. Überlappende Anrufe erhalten die Sperre nicht und kehren sofort zurück.

object lockObject = new object(); 

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

+1 Schöne Lösung. –

6

Sie können eine System.Threading.Timer deaktivieren, indem Sie das Intervall ändern. Sie können dies durch den Aufruf:

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

Sie werden das Intervall ändern müssen, um wieder, sobald Sie fertig sind Aufruf myfunction wenn der Timer wieder fortsetzen zu feuern.

Verwandte Themen