Was ist ein Unterschied between System.Windows.Forms.Timer()
und System.Windows.Threading.DispatcherTimer()
? In welchen Fällen sollten wir sie verwenden? Best Practices?
Was ist ein Unterschied between System.Windows.Forms.Timer()
und System.Windows.Threading.DispatcherTimer()
? In welchen Fällen sollten wir sie verwenden? Best Practices?
Antworten:
Windows.Forms.Timer
Verwendet 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.
DispatcherTimer
ist 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 == DispatcherTimer
und Windows Forms == Forms.Timer
.
Davon abgesehen gibt es auch System.Threading.Timer
einen 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.
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