Confronto tra Timer e DispatcherTimer


98

qual è la differenza between System.Windows.Forms.Timer()e System.Windows.Threading.DispatcherTimer()? In quali casi dovremmo usarli? eventuali buone pratiche?

Risposte:


111

Windows.Forms.Timerutilizza il loop di messaggi di Windows Form per elaborare gli eventi del timer. Deve essere utilizzato durante la scrittura di eventi di temporizzazione utilizzati nelle applicazioni Windows Form e si desidera che il timer si attivi sul thread dell'interfaccia utente principale.

DispatcherTimerè il meccanismo di temporizzazione WPF. Dovrebbe essere utilizzato quando si desidera gestire i tempi in modo simile (sebbene questo non sia limitato a un singolo thread: ogni thread ha il proprio dispatcher) e si utilizza WPF. Attiva l'evento sullo stesso thread del Dispatcher.

In generale, WPF == DispatcherTimere Windows Forms == Forms.Timer.

Detto questo, c'è anche System.Threading.Timer, che è un timer classche si attiva su un thread separato. Questo è un bene per i tempi puramente numerici, in cui non stai cercando di aggiornare l'interfaccia utente, ecc.


1
Grazie per la risposta immediata. Quindi questo significa che ogni volta che voglio avere un timer relativo all'interfaccia utente, dovrei usare DispatcherTimer e quando voglio attivare un timer, che non voglio congelare UL, dovrei usare System.Threading.Timer in un separato filo. La seconda domanda è: se voglio usare DispatcherTimer e voglio avere un timer non associato all'interfaccia utente, dovrei chiamarlo in un thread separato usando System.Threading.Timer o ancora DisptacherTimer?
paradisonoir

3
Dipende da cosa stai cercando di fare. Uso raramente System.Threading.Timer: di solito mi attengo a Dispatcher Timer e quindi eseguo il LAVORO (che è ciò che potrebbe bloccare la tua interfaccia utente) in un altro thread, usando qualcosa come BackgroundWorker. I timer in realtà non dovrebbero mai bloccare la tua interfaccia utente, a meno che tu non stia facendo "troppo" lavoro nel loro gestore di eventi.
Reed Copsey

Ho un problema con DispatcherTimer che consuma il processore nel tempo. C'è un buon modo per gestirlo?
discorace

Controlla per vedere cosa sta mangiando specificamente la CPU. Stai creando molti timer che non vengono fermati?
Reed Copsey

3
Assicurati di impostare correttamente la proprietà interval. Non farlo: timer1.Interval = new TimeSpan (1000); // "1000" rappresenta tick non millisecondi! La CPU era molto alta, finché non l'ho corretta con questo: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best

4

Ho trovato un buon articolo sui timer con piccoli esempi qui: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Come conclusione:

Se DoSomething () manipola i componenti della GUI, allora con il Timer devi usare: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} poiché non puoi accedere direttamente ai controlli della GUI da un thread diverso. Con DispatcherTimer lo fai non è necessario farlo.

Se DoSomething () esegue come un'attività che richiede tempo, la GUI si bloccherà nel caso del DispatcherTimer. Nel caso del Timer non lo farà poiché il methos lungo viene eseguito in un thread diverso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.