2012-11-07 19 views
7

Powiel możliwe:
Synchronizing a timer to prevent overlapJak wstrzymać Threading.timer aby zakończyć funkcję

Mam Threading.Timer w mojej klasie.

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

i zdefiniowano dla niego wywołanie zwrotne.

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

Po uruchomieniu należy ponownie uruchomić wywołanie zwrotne przed zakończeniem myfunction.

Jak zatrzymać Threading.Timer, aby zakończyć myfunction?

+0

Myślę, że chcesz, aby zapobiec [czasowego nakładania] (http://stackoverflow.com/questions/684200/synchronizing-a-timer-to-prevent-overlap). –

Odpowiedz

14

Nie ma potrzeby zatrzymywania stopera, możesz pozwolić, aby timer kontynuował uruchamianie metody wywołania zwrotnego, ale zawinął swój nierealny kod w Monitor.TryEnter/Exit. Nie ma potrzeby zatrzymywania/restartowania stopera w takim przypadku; nakładające się połączenia nie uzyskają natychmiast blokady i zwrotu.

object lockObject = new object(); 

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

+ 1 Ładne rozwiązanie. –

6

Można wyłączyć System.Threading.Timer, zmieniając przedział. Można to zrobić poprzez wywołanie:

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

Będziesz musiał zmienić interwał z powrotem po zakończeniu nazywając myfunction jeśli chcesz timer kontynuować wypalanie ponownie.

Powiązane problemy