Frage

Das ist mir bewusst .NETZ Es gibt drei Timertypen (siehe Vergleich der Timer-Klassen in der .NET Framework-Klassenbibliothek).Ich habe mich für einen Thread-Timer entschieden, da die anderen Typen abdriften können, wenn der Hauptthread ausgelastet ist, und dieser muss zuverlässig sein.

Die Art und Weise, wie dieser Timer funktioniert, wird durch die Steuerung des Timers auf einen anderen Thread übertragen, sodass er immer mit der Arbeit beginnen kann, die im übergeordneten Thread abgeschlossen ist, wenn dieser nicht beschäftigt ist.

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

Ich habe versucht, ein hinzuzufügen while true Schleife, aber dann ist der Hauptthread zu beschäftigt, wenn der Timer abläuft.

War es hilfreich?

Lösung

Sie können so etwas wie verwenden Console.ReadLine() um den Hauptthread zu blockieren, damit andere Hintergrundthreads (wie Timer-Threads) weiterhin funktionieren.Sie können auch eine verwenden AutoResetEvent Um die Ausführung zu blockieren, können Sie (bei Bedarf) 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 den Gültigkeitsbereich verlässt und der Müll gesammelt wird.

Andere Tipps

Erwägen Sie die Verwendung von a ManualResetEvent um den Hauptthread am Ende seiner Verarbeitung zu blockieren und aufzurufen Reset() darauf, sobald die Verarbeitung des Timers abgeschlossen ist.Wenn dies etwas ist, das ständig ausgeführt werden muss, sollten Sie erwägen, es in einen Dienstprozess statt in eine Konsolen-App zu verschieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top