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.

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.