Ich habe in letzter Zeit einige der möglichen Timer Check - out, und System.Threading.Timer
und System.Timers.Timer
sind diejenigen , die mir notwendig aussehen (da sie Threadpooling unterstützen).
Ich mache ein Spiel und plane, alle Arten von Ereignissen mit unterschiedlichen Intervallen usw. zu verwenden.
Welches wäre das Beste?
Threading.Timer
‚s MSDN - Artikel , ist es perfekt Thread-sicher ...System.Threading.Timer
ist so "ironisch" nicht threadsicher wieSystem.Threading.Thread
und die durch den Pool erhaltenen Threads. Nur weil diese Klassen Ihre Hand nicht halten und die Verwendung deslock
Schlüsselworts selbst verwalten, bedeutet dies nicht, dass diese Klassen nicht threadsicher sind. Man könnte genauso gut sagenSystem.Threading.Thread
, dass es nicht threadsicher ist, weil es genau so wahr ist.SynchronizingObject
macht das Timer-Objekt selbst nicht threadsicher. Es wird lediglich sichergestellt, dass Ihr Code zur Behandlung des Timer-Ereignisses in einem bestimmten Thread aufgerufen wird (wenn Sie diese Eigenschaft entsprechend festlegen). Das Timer-Objekt selbst ist nicht garantiert threadsicher, wie in der Dokumentation klar angegeben. Auf der anderen Seite, dasSystem.Threading.Timer
Objekt wird als threadsicher spezifisch dokumentiert.System.Threading.Timer
ist ein einfacher Timer. Es ruft Sie in einem Thread-Pool-Thread (aus dem Worker-Pool) zurück.System.Timers.Timer
ist aSystem.ComponentModel.Component
, das a umschließtSystem.Threading.Timer
und einige zusätzliche Funktionen bietet, die zum Versenden auf einem bestimmten Thread verwendet werden.System.Windows.Forms.Timer
Umschließt stattdessen einen nativen Nur-Nachrichten-HWND und verwendet Fenster -Timer , um Ereignisse in dieser HWND-Nachrichtenschleife auszulösen.Wenn Ihre App keine Benutzeroberfläche hat und Sie einen möglichst leichten und universellen .Net-Timer wünschen (weil Sie gerne Ihr eigenes Threading / Dispatching herausfinden),
System.Threading.Timer
ist dies so gut wie im Framework.Ich bin mir nicht ganz sicher, was die angeblichen "nicht threadsicheren" Probleme
System.Threading.Timer
sind. Vielleicht ist es genau das Gleiche wie in dieser Frage gestellt: Thread-Sicherheit von System.Timers.Timer vs System.Threading.Timer , oder vielleicht meint jeder nur das:Es ist einfach, Rennbedingungen zu schreiben, wenn Sie Timer verwenden. Siehe zB folgende Frage: Timer (System.Threading) Thread-Sicherheit
Wiedereintritt von Timer-Benachrichtigungen, bei denen Ihr Timer-Ereignis Sie ein zweites Mal auslösen und zurückrufen kann, bevor Sie die Verarbeitung des ersten Ereignisses abgeschlossen haben. Siehe beispielsweise diese Frage: Thread-sichere Ausführung mit System.Threading.Timer und Monitor
quelle
System.Timers.Timer
verwendet einSystem.Threading.Timer
internes. Siehe Quellcode .In seinem Buch " CLR Via C # " rät Jeff Ritcher davon ab
System.Timers.Timer
, diesen TimerSystem.ComponentModel.Component
zu verwenden, damit er in der Designoberfläche von Visual Studio verwendet werden kann. Damit wäre es nur sinnvoll, wenn Sie einen Timer auf einer Designoberfläche haben möchten.Er bevorzugt die Verwendung
System.Threading.Timer
für Hintergrundaufgaben in einem Thread-Pool-Thread.quelle
System.Threading.Timer
entspricht der Verwendung eines Thread-Pools oder der Erstellung eines eigenen Threads. Von natürlich diese Klassen behandeln nicht die Synchronisation für Sie - das ist Ihre Aufgabe! Weder ein Thread-Pool-Thread, Ihr eigener Thread noch ein Timer-Rückruf übernehmen das Sperren - für welches Objekt und auf welche Weise und unter welchen Umständen Sie sperren müssen, ist ein gutes Urteilsvermögen erforderlich, und die Threading-Version des Timers bietet Ihnen die größte Flexibilität und Flexibilität Die Granularität.Informationen von Microsoft dazu (siehe Anmerkungen zu MSDN ):
Es ist interessant zu erwähnen, dass dies
System.Timers.Timer
mit .NET Core 1.0 veraltet war, aber in .NET Core 2.0 (/ .NET Standard 2.0) erneut implementiert wurde. Das Ziel von .NET Standard 2.0 war, dass es so einfach wie möglich sein sollte, von .NET Framework zu wechseln, was wahrscheinlich der Grund dafür ist, dass es zurückkam.Wenn es veraltet war, wurde empfohlen, stattdessen das Visual Studio-Add-In von .NET Portability Analyzer zu verwenden
System.Threading.Timer
.Microsoft hat das schon
System.Threading.Timer
früher bevorzugtSystem.Timers.Timer
.BEARBEITUNGSHINWEIS 2018-11-15: Ich möchte meine Antwort ändern, da die alten Informationen zu .NET Core 1.0 nicht mehr gültig waren.
quelle
Ein wichtiger Unterschied, der oben nicht erwähnt wurde und Sie
System.Timers.Timer
auffallen könnte, ist, dass Ausnahmen stillschweigend verschluckt werden, währendSystem.Threading.Timer
dies nicht der Fall ist.Zum Beispiel:
vs.
quelle
Ich habe einen kurzen Vergleich von MSDN gefunden
quelle
Die beiden Klassen sind funktional äquivalent, außer dass
System.Timers.Timer
eine Option zum Aufrufen aller Timer- Ablaufrückrufe über ISynchronizeInvoke durch Festlegen von SynchronizingObject besteht . Andernfalls rufen beide Timer Ablaufrückrufe für Thread-Pool-Threads auf.Wenn Sie a
System.Timers.Timer
auf eine Windows Forms-Entwurfsoberfläche ziehen, setzt Visual Studio SynchronizingObject auf das Formularobjekt, wodurch alle Ablaufrückrufe im UI-Thread aufgerufen werden.quelle
Von MSDN:
System.Threading.Timer
ist ein einfacher, leichter Timer, der Rückrufmethoden verwendet und von Thread-Pool-Threads bereitgestellt wird. Es wird für die Verwendung mit Windows Forms nicht empfohlen, da die Rückrufe im Thread der Benutzeroberfläche nicht auftreten.System.Windows.Forms.Timer
ist eine bessere Wahl für die Verwendung mit Windows Forms. Für die serverbasierte Timer-Funktionalität können Sie die Verwendung in Betracht ziehenSystem.Timers.Timer
, die Ereignisse auslöst und zusätzliche Funktionen bietet.Quelle
quelle