Hintergrund: Ich habe einen Timer, den ich verwende, um zu verfolgen, wie lange es her ist, seit das serialPort-DataReceived-Ereignis ausgelöst wurde. Ich erstelle meine eigene Lösung, anstatt das eingebaute Timeout-Ereignis zu verwenden, da ich einen kontinuierlichen Datenstrom bekomme, anstatt eine Abfrage zu senden und eine Antwort zu erhalten.
Das Problem: Im DataReceived-Handler habe ich eine Anweisung, um den Timer zu stoppen, so dass er nicht abläuft. Das Problem besteht darin, dass das Elapsed-Handler-Nachwort oft noch ausgeführt wird.
Ich habe gelesen, dass es möglich ist, SynchronizingObject zu verwenden, um dieses Problem zu lösen, aber ich bin mir nicht sicher, wie ich das erreichen soll.
Hier ist mein Code: Ich habe versucht, alles auszuschneiden, was ich nicht für relevant hielt.
%Vor% Das ist bekanntes Verhalten. System.Timers.Timer
verwendet intern ThreadPool
für die Ausführung. Runtime wird die Timer
im Threadpool in die Warteschlange stellen. Es wäre bereits in die Warteschlange gestellt worden, bevor Sie Stop
method aufgerufen haben. Es wird nach der verstrichenen Zeit ausgelöst.
Um dies zu vermeiden, setzen Sie Timer.AutoReset
auf "false" und starten Sie den Timer im veralteten Handler, falls Sie einen benötigen. Wenn Sie AutoReset
false setzen, wird der Timer nur einmal ausgelöst. Um den Timer auf Intervall zu setzen, starten Sie den Timer erneut manuell.