Zuverlässiger Timer in einer Konsolenanwendung

102

Mir ist bekannt, dass es in .NET drei Timer-Typen gibt (siehe Vergleichen der Timer-Klassen in der .NET Framework-Klassenbibliothek ). Ich habe einen Thread-Timer ausgewählt, da die anderen Typen driften können, wenn der Haupt-Thread ausgelastet ist, und ich brauche diesen, um zuverlässig zu sein.

Die Art und Weise, wie dieser Timer bei der Steuerung des Timers funktioniert, wird einem anderen Thread zugewiesen, sodass er immer zusammen mit dem Beginn der Arbeit am übergeordneten Thread ankreuzen kann, wenn dieser nicht beschäftigt ist.

Das Problem mit diesem Timer in einer Konsolenanwendung ist, dass der Hauptthread nichts mit dem Schließen der Anwendung tut, während der Timer in einem anderen Thread läuft.

Ich habe versucht, eine while trueSchleife hinzuzufügen , aber dann ist der Haupt-Thread zu beschäftigt, wenn der Timer abläuft.

John
quelle

Antworten:

59

Sie können so etwas wie Console.ReadLine()das Blockieren des Hauptthreads verwenden, sodass andere Hintergrundthreads (wie Timer-Threads) weiterhin funktionieren. Sie können auch ein AutoResetEvent verwenden , um die Ausführung zu blockieren. Anschließend können Sie (falls erforderlich) die Set () -Methode für dieses AutoResetEvent-Objekt aufrufen, um den Hauptthread freizugeben. Stellen Sie außerdem sicher, dass Ihr Verweis auf das Timer-Objekt nicht außerhalb des Gültigkeitsbereichs liegt und kein Müll gesammelt wird.

huseyint
quelle
20

Verwenden Sie ein ManualResetEvent , um den Hauptthread am Ende seiner Verarbeitung zu blockieren, und rufen Sie ihn Reset()auf, sobald die Verarbeitung des Timers abgeschlossen ist. Wenn dies kontinuierlich ausgeführt werden muss, sollten Sie dies in einen Serviceprozess anstelle einer Konsolen-App verschieben.

Greg Hurlman
quelle