System.Timers.Timer Abgelaufenes Ereignis, das nach dem Aufruf von timer.Stop () ausgeführt wird

7

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%     
TheColonel26 16.08.2013, 19:00
quelle

2 Antworten

24

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.

%Vor%     
Sriram Sakthivel 16.08.2013, 19:14
quelle
2

Ich habe mit diesem Code eine Pause im Timer gemacht. für mich funktioniert das.

%Vor%     
Sketch 01.09.2017 13:02
quelle

Tags und Links