2010-12-30 31 views
46

So che sembra stupido, ma ho provato di tutto per fermare un timer, ma il timer non si fermerà. Sto lavorando a un gioco e sarei grato se qualcuno potesse dirmi come fermare un timer.C# - come si ferma un timer?

+7

inserisci il tuo codice per un buon inizio. – Pabuc

+1

Mostraci un codice – Kimtho6

+3

Quale delle classi di timer? Ce ne sono 4 che conosco, proprio nel BCL. – Oded

risposta

105

se si utilizza System.Timers.Timer si può fermare in questo modo

timer.Enabled = false 

se si utilizza System.Threading.Timer, utilizzare questo

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

Oppure utilizzare

timer.Stop(); 

se si utilizza System.Windows.Forms.Timer

1

Supponendo che si stia utilizzando System.Windows.Forms.Timer; poiché non vi era alcun riferimento esplicito a qualsiasi altra cosa ... se questo è il caso ...

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; o timer.Stop();

5

Con ciascuno dei temporizzatori nel framework .NET, è possibile che il timer si accenda appena prima di fermarlo, quindi vedrai la richiamata dopo averla interrotta.

Avrete bisogno di usare qualcosa come un asynchronous callback context: utilizzare un set bool per true quando si desidera che il timer in funzione, e impostarlo su false quando si smette di esso. Quindi controlla il tuo contesto per vedere se dovrebbe davvero funzionare o meno.

+1

Sono contento di aver trovato questa informazione anche qui. Sto usando, invece della variabile extra, controllando se il timer è ancora abilitato nel callback del timer. – Fanda

1

Dipende dal timer. Se proviene dal threading dello spazio dei nomi, smaltirlo e ricrearlo quando è necessario, oppure fare in modo che il timer deleghi l'attesa all'evento di reimpostazione (vedere msdn). Il namespace System.Timers ha un metodo start e stop.

15

Quindi, per aggiungere alle risposte precedenti, nel caso in cui si utilizza la classe System.Threading.Timer, Questo fermerà definitivamente senza ulteriori possibilità di utilizzare la stessa istanza:

timer.Dispose() 

altrimenti:

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