Server Timers sind eine andere Kreatur als schlafende Fäden.
Zum einen kann, abhängig von der Priorität Ihres Threads, und was sonst noch ausgeführt wird, Ihr schlafender Thread geweckt werden oder nicht und in dem von Ihnen angeforderten Intervall ausgeführt werden. Wenn das Intervall lang genug ist und die Genauigkeit der Planung keine Rolle spielt, ist Thread.Sleep()
eine vernünftige Wahl.
Timer hingegen können ihre Ereignisse in einem beliebigen Thread auslösen, was bessere Planungsfunktionen ermöglicht. Die Kosten für die Verwendung von Timern sind jedoch ein wenig komplexer in Ihrem Code - und die Tatsache, dass Sie möglicherweise nicht in der Lage sind, zu steuern, welcher Thread die Logik ausführt, auf der das Timer-Ereignis ausgelöst wird. Aus der Dokumentation:
Die serverbasierte Timer ist für Verwendung mit Worker-Threads in einer Multithreaded-Umgebung entwickelt. Server Timer können zwischen Threads verschieben, um behandeln das erhöhte Elapsed-Ereignis, Ergebnis in mehr Genauigkeit als Windows-Timer bei der Erhöhung des Ereignisses auf Zeit.
Eine weitere Überlegung ist, dass Zeitgeber ihren Elapsed-Delegaten für einen ThreadPool-Thread aufrufen. Je nachdem, wie zeitaufwändig und/oder kompliziert Ihre Logik ist, möchten Sie sie möglicherweise nicht im Thread-Pool ausführen. Möglicherweise möchten Sie einen dedizierten Thread. Ein weiterer Faktor bei Zeitgebern ist, dass, wenn die Verarbeitung lange genug dauert, das Zeitgeberereignis erneut (gleichzeitig) auf einem anderen Thread ausgelöst werden kann - was ein Problem sein kann, wenn der gerade ausgeführte Code nicht für Gleichzeitigkeit vorgesehen oder strukturiert ist.
Sie Server Timer mit "Windows Timers" nicht verwirren. Letzteres bezieht sich in der Regel auf WM_TIMER-Nachrichten, die an ein Fenster gesendet werden können, sodass eine App die zeitgesteuerte Verarbeitung für ihren Hauptthread planen und darauf reagieren kann, ohne zu schlafen. Windows-Timer können sich jedoch auch auf die Win API for low-level timing beziehen (die nicht mit WM_TIMER identisch ist).
und du hast meine. – Alan
@Alan: und Sie haben meine – abatishchev
Die System.Timers.Timer-Klasse kann wirklich in einem Benutzermodus Anwendung genauso einfach wie System.Threading.Timer verwendet werden. Intern verwendet System.Timers.Timer System.Threading.Timer für seinen internen Timing-Mechanismus und umschließt es nur, um Probleme mit der Entwurfszeit zu behandeln ... –