2010-12-30 9 views
46

Wiem, że to brzmi głupio, ale próbowałem wszystkiego, aby zatrzymać stoper, ale timer się nie zatrzyma. Pracuję nad grą i byłbym wdzięczny, gdyby ktoś mógł mi powiedzieć, jak zatrzymać stoper.C# - jak zatrzymać stoper?

+7

opublikować kod na dobry początek. – Pabuc

+1

Pokaż nam kod – Kimtho6

+3

Które z klas timerów? Są 4, które znam, tylko w BCL. – Oded

Odpowiedz

105

Jeśli używasz System.Timers.Timer można zatrzymać tak

timer.Enabled = false 

jeśli używasz System.Threading.Timer, używać tego

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

Albo użyć

timer.Stop(); 

jeśli używasz System.Windows.Forms.Timer

1

Zakładając, że korzystasz z System.Windows.Forms.Timer; ponieważ nie było wyraźnego odniesienia do czegokolwiek innego ... jeśli tak jest ...

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); 
myTimer.Stop(); 
17

System.Windows.Forms.Timer: timer.Enabled = false;
System.Threading.Timer: timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer: timer.Enabled = false; lub timer.Stop();

5

z każdym z timerów w platformie .NET jest możliwe, że timer uruchamia się tuż przed jego zatrzymaniem, więc zobaczysz wywołanie zwrotne po jego zatrzymaniu.

Musisz użyć czegoś jak asynchronous callback context: użyj bool zestaw do true kiedy chcesz bieg zegara i ustawić go na false kiedy go zatrzymać. Następnie sprawdź swój kontekst, aby sprawdzić, czy naprawdę powinien działać, czy nie.

+1

Cieszę się, że znalazłem tu również tę informację. Używam, zamiast dodatkowej zmiennej, sprawdzanie, czy timer jest nadal włączony w oddzwanianiu timera. – Fanda

1

Zależy od licznika czasu. Jeśli pochodzi z wątku przestrzeni nazw, pozbądź się go i odtwórz go, gdy zajdzie taka potrzeba, lub poproś, by timer wstrzymał się z decyzją o zresetowaniu (zobacz msdn). Przestrzeń nazw System.Timers ma metodę uruchamiania i zatrzymywania.

15

Tak, aby dodać do poprzednich odpowiedzi, w przypadku korzystania z klasy System.Threading.Timer, będzie go zatrzymać na stałe bez dalszych szansę wykorzystać tę samą instancję:

timer.Dispose() 

inaczej:

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