Timer mit DispatcherTimer vergleichen

98

Was ist ein Unterschied between System.Windows.Forms.Timer()und System.Windows.Threading.DispatcherTimer()? In welchen Fällen sollten wir sie verwenden? Best Practices?

Paradisonoir
quelle

Antworten:

111

Windows.Forms.TimerVerwendet die Windows Forms-Nachrichtenschleife, um Timer-Ereignisse zu verarbeiten. Es sollte verwendet werden, wenn Timing-Ereignisse geschrieben werden, die in Windows Forms-Anwendungen verwendet werden, und Sie möchten, dass der Timer auf dem Haupt-UI-Thread ausgelöst wird.

DispatcherTimerist der WPF-Zeitmechanismus. Es sollte verwendet werden, wenn Sie das Timing auf ähnliche Weise behandeln möchten (obwohl dies nicht auf einen einzelnen Thread beschränkt ist - jeder Thread hat seinen eigenen Dispatcher) und Sie WPF verwenden. Das Ereignis wird im selben Thread wie der Dispatcher ausgelöst.

Im Allgemeinen WPF == DispatcherTimerund Windows Forms == Forms.Timer.

Davon abgesehen gibt es auch System.Threading.Timereinen Timer class, der auf einem separaten Thread ausgelöst wird. Dies ist gut für rein numerisches Timing, bei dem Sie nicht versuchen, die Benutzeroberfläche usw. zu aktualisieren.

Reed Copsey
quelle
1
Danke für Ihre schnelle Antwort. Das heißt, wenn ich einen Timer für die Benutzeroberfläche haben möchte, sollte ich DispatcherTimer verwenden, und wenn ich einen Timer auslösen möchte, den ich UL nicht einfrieren möchte, sollte ich System.Threading.Timer in einem separaten verwenden Faden. Die zweite Frage lautet: Wenn ich DispatcherTimer verwenden möchte und einen Timer haben möchte, der nicht an die Benutzeroberfläche gebunden ist, sollte ich ihn in einem separaten Thread mithilfe von System.Threading.Timer oder noch DisptacherTimer aufrufen?
Paradisonoir
3
Es hängt davon ab, was Sie versuchen zu tun. Ich verwende System.Threading.Timer selten. Normalerweise halte ich mich an den Dispatcher-Timer und erledige dann Ihre ARBEIT (was Ihre Benutzeroberfläche blockieren könnte) in einem anderen Thread mit etwas wie einem BackgroundWorker. Die Timer sollten Ihre Benutzeroberfläche niemals blockieren, es sei denn, Sie erledigen "zu viel" Arbeit in ihrem Ereignishandler.
Reed Copsey
Ich habe ein Problem damit, dass DispatcherTimer den Prozessor im Laufe der Zeit auffrisst. Gibt es eine gute Möglichkeit, damit umzugehen?
Discorax
Überprüfen Sie, was speziell die CPU auffrisst. Erstellen Sie viele Timer, die nicht gestoppt werden?
Reed Copsey
3
Stellen Sie sicher, dass Sie die Intervalleigenschaft richtig eingestellt haben. Tun Sie dies nicht: timer1.Interval = new TimeSpan (1000); // "1000" steht für Ticks, nicht für Millisekunden! Die CPU war super hoch, bis ich sie damit korrigierte: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best
4

Ich habe hier einen guten Artikel über Timer mit kleinen Beispielen gefunden: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Als Schlussfolgerung:

Wenn DoSomething () GUI-Komponenten manipuliert, müssen Sie mit dem Timer Folgendes verwenden: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE}, da Sie nicht direkt von einem anderen Thread auf GUI-Steuerelemente zugreifen können. Mit DispatcherTimer tun Sie dies muss das nicht tun.

Wenn DoSomething () eine zeitaufwändige Aufgabe ausführt, friert die GUI im Fall des DispatcherTimer ein. Im Fall des Timers wird dies nicht der Fall sein, da das lange Methos in einem anderen Thread ausgeführt wird

Seekeer
quelle