2009-06-25 16 views
87

Ci sono tre Timer classi che sono a conoscenza di, System.Threading.Timer, System.Timers.Timer, e System.Windows.Forms.Timer, ma nessuno di questi hanno una funzione .Reset() che resettare il tempo trascorso corrente a 0.Come resettare un timer in C#?

C'è una classe che ha questa BCL funzionalità? C'è un modo non hack di farlo? (Ho pensato che forse la modifica del limite di tempo potrebbe ripristinarlo) Pensavo a quanto sarebbe stato difficile reimplementare una classe Timer con questa funzionalità, o come farlo in modo affidabile con una delle classi BCL?

+3

Utilizzo della soluzione di JP utilizzare un metodo di estensione – benPearce

+0

Anche io ho lo stesso bisogno di ripristino e per gli stessi motivi menzionati, FileSystemWatcher è spiacevole e scomodo da usare –

+0

Se si usa Cronometro per un timer e si va con il metodo di estensione risposta, si attento perché il metodo di estensione Stopwatch.Restart è in arrivo su .NET 4.0. http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.restart(VS.100,lightweight).aspx – si618

risposta

113

faccio sempre ...

myTimer.Stop(); 
myTimer.Start(); 

... è che un hack? :)

Per commentare, su Threading.Timer, è il tipo Change method ...

dueTime: System.Int32 La quantità di tempo per ritardo prima che il invocando il metodo di callback specificato quando il timer è stato costruito, in millisecondi. Specificare Timeout.Infinite per impedire il riavvio del timer . Specificare lo zero (0) per riavviare immediatamente il timer.

+0

L'altro problema è che solo woeks con Forms.Timer e la mia app non ha GUI (Application.Start() senza parametri), quindi PENSO che la classe Threading.Timer sia migliore per altri motivi, ma buon punto. –

+3

@Matthew: vedere http://msdn.microsoft.com/en-us/magazine/cc164015.aspx per una discussione sulle varie classi di timer e quando è opportuno utilizzarle. In generale, tuttavia, 'Forms.Timer' deve essere utilizzato solo con una GUI. Tuttavia, oltre a 'Forms.Timer' e' Threading.Timer' c'è anche 'Timers.Timer'. – Brian

44

Tutti i timer hanno l'equivalente dei metodi Start() e Stop(), ad eccezione di System.Threading.Timer.

Quindi un metodo di estensione, come ...

public static void Reset(this Timer timer) 
{ 
    timer.Stop(); 
    timer.Start(); 
} 

... è un modo per andare su di esso.

+1

Non sto cercando di misurare il tempo trascorso. Il mio caso esatto per questo è che ho un FileSystemWatcher che guarda una directory e voglio catturare gruppi di modifiche (ad esempio, le modifiche apportate all'interno per esempio 5s l'una dall'altra). La teoria è che il primo cambiamento inizia un timer che viene ripristinato ad ogni modifica fino a quando alla fine spara e chiude il gruppo. –

+0

Sì, l'ho notato quando ho riletto la tua domanda. Modificato la mia risposta. – Dan

4

Si potrebbe scrivere un nome di Reset metodo di estensione(), che

  • chiama Stop() - Start() per Timers.Timer e Forms.Timer
  • chiamate Cambia Threading.Timer
1

Altro modo alternativo per ripristinare il windows.timer è utilizzando il contatore, come segue:

int tmrCtr = 0; 
Timer mTimer; 

private void ResetTimer() 
{ 
    tmrCtr = 0; 
} 

private void mTimer_Tick() 
{ 
    tmrCtr++; 
    //perform task 
} 

Quindi, se si intende ripetere ogni 1 secondo, è possibile impostare l'intervallo del timer su 100 ms e testare il contatore su 10 cicli.

Questo è adatto se il timer deve attendere alcuni processi che potrebbero essere terminati in un diverso intervallo di tempo.

2

Per un timer (System.Windows.Forms.Timer).

I metodi .Stop, quindi. Start hanno funzionato come reset.

19

Per System.Timers.Timer, in base alla documentazione MSDN, http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx:

Se l'intervallo è impostato dopo che il timer è iniziata, il conteggio è azzerato.Ad esempio, se si imposta l'intervallo su 5 secondi e quindi si imposta la proprietà Enabled su true, il conteggio inizia nel momento in cui Enabled è impostato su . Se si reimposta l'intervallo su 10 secondi quando il conteggio è 3 secondi, l'evento Elapsed viene generato per la prima volta 13 secondi dopo che Abilitato è stato impostato su true.

Quindi,

const double TIMEOUT = 5000; // milliseconds 

    aTimer = new System.Timers.Timer(TIMEOUT); 
    aTimer.Start();  // timer start running 

    : 
    : 

    aTimer.Interval = TIMEOUT; // restart the timer 
+1

Il problema è che non si sa sempre nel momento in cui si desidera resettare se il timer è già in esecuzione o meno. Quindi, dovresti fare aTimer.Interval = TIMEOUT e a aimer.Start(). Quindi, nel complesso, una funzione di ripristino sopra utilizza meno righe e variabili. Grande aggiunta però. –

+1

@ R-U-Bn L'OP indica chiaramente la funzione "* a .Reset() che reimposta il tempo corrente su 0 *."- Non menziona che è destinato ad essere utilizzato su un'applicazione progettata in modo inadeguato in cui non si sa nemmeno se il timer è in esecuzione. Controlla anche il commento dell'autore (più di 4 anni fa):" * La teoria è che il primo cambiamento inizia un timer che viene ripristinato ad ogni modifica finché alla fine si attiva e chiude il gruppo. * ". Grazie per il voto negativo, comunque. – mMontu

+0

Non importa, sono solo informazioni extra per altre persone. Non solo a valle, ho appena preso il mio uptote indietro PPS Non salire sul cavallo così facilmente –

3

Ho appena assegnato un nuovo valore per il timer:

mytimer.Change(10000, 0); // reset to 10 seconds 

tutto funziona bene per me.

nella parte superiore del codice definiscono il timer: System.Threading.Timer myTimer;

if (!active) 
     { 
      myTimer= new System.Threading.Timer(new TimerCallback(TimerProc)); 
     } 
     myTimer.Change(10000, 0); 
     active = true; 

private void TimerProc(object state) 
    { 
     // The state object is the Timer object. 
     System.Threading.Timer t = (System.Threading.Timer)state; 
     t.Dispose(); 
     Console.WriteLine("The timer callback executes."); 
     active = false; 
     //action to do when timer is back to zero 
    } 
0

faccio questo

//Restart the timer 
queueTimer.Enabled = true; 
+0

Questo lo abilita, anche se prima era disabilitato, la riattivazione non cambiava il tempo trascorso che era stato raccolto a quel punto. – vapcguy

0

si può fare timer.Interval = timer.Interval

0

Per chiarezza dal momento che alcuni altri commenti sono corretti, quando utilizzando l'impostazione System.Timers Attivato su true il azzera il tempo trascorso. Ho appena testato il comportamento con il seguito:

Timer countDown= new Timer(); 

Main() 
{ 
    TextBox.TextDidChange += TextBox_TextDidChange; 
    countdown.Elapsed += CountDown_Elapsed; 
} 

void TextBox_TextDidChange(Object sender, EventArgs e) 
{ 
    countdown.Enabled = true; 
} 

void CountDown_Elapsed(object sender, EventArgs e) 
{ 
    System.Console.WriteLine("Elapsed"); 
} 

vorrei testo di input per la casella di testo più volte e il timer avrebbe eseguito solo 3 secondi dopo l'ultimo tasto. È accennato anche nei documenti, come vedrai chiamare "Timers.Start()" imposta semplicemente Enabled su true.

E per essere sicuro, che avrei dovuto seguire fin dall'inizio, vedrai nello .NET reference source che se abiliti un timer già abilitato chiama il metodo privato UpdateTimer(), che internamente chiama Change ().