Système.Les minuteries.Minuterie événement Écoulé après l'exécution de la minuterie.Stop() est appelée
De fond: j'ai un minuteur que j'utilise pour garder une trace de combien de temps il a été depuis la serialPort DataReceived événement a été déclenché. Je suis entrain de créer ma propre solution au lieu d'utiliser le construit en événement de délai d'attente parce que je suis l'obtention d'un flux continu de données, au lieu de l'envoi d'une requête et d'obtenir une réponse.
Le Problème:
Dans le DataReceived gestionnaire, j'ai une déclaration à l'arrêt de la minuterie, de sorte que ne se soient écoulées. le problème est que beaucoup de temps s'exécute encore le temps Écoulé gestionnaire de la postface.
J'ai lu qu'il est possible d'utiliser SynchronizingObject pour résoudre ce problème, mais je ne suis pas sûr de la façon de le faire.
Voici mon code: j'ai essayé de couper tout ce que je ne pensais pas pertinent.
private System.Timers.Timer timeOut;
private System.Timers.Timer updateTimer;
public void start()
{
thread1 = new Thread(() => record());
thread1.Start();
}
public void requestStop()
{
this.stop = true;
this.WaitEventTest.Set();
}
private void record()
{
timeOut = new System.Timers.Timer(500); //** .5 Sec
updateTimer = new System.Timers.Timer(500); //** .5 Sec
timeOut.Elapsed += TimeOut_Elapsed;
updateTimer.Elapsed += updateTimer_Elapsed;
updateTimer.AutoReset = true;
comport.Open();
comport.DiscardInBuffer();
comport.Write(COMMAND_CONTINUOUSMODE + "\r");
stopwatch.Reset();
stopwatch.Start();
recordingStartTrigger(); //** Fire Recording Started Event
timeOut.Start();
updateTimer.Start();
this.waitHandleTest.WaitOne(); //** wait for test to end
timeOut.Stop();
updateTimer.Stop();
comport.Write(COMMAND_COMMANDMODE + Environment.NewLine);
comport.DiscardInBuffer();
comport.Close();
recordingStopTrigger(status); //** Fire Recording Stopped Event
stopwatch.Stop();
}
//***********************************************************************************
//** Events Handlers
private void comDataReceived_Handler(object sender, SerialDataReceivedEventArgs e)
{
double force = -100000;
string temp = "-100000";
//timeOut.SynchronizingObject.Invoke(new Action(()=> {timeOut.Stop();}), new object[] {sender, e});
timeOut.Stop();
//** I removed my action code here, keep things simple.
timeOut.Start();
}
private void TimeOut_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timeOut.Stop();
updateTimer.Stop();
//** fire delegate that GUI will be listening to, to update graph.
if (eventComTimeOut != null && this.stop == false)
{
if (eventComTimeOut(this, new eventArgsComTimeOut(comport.PortName, "READ")))
{
//retry = true;
comport.Write(COMMAND_CONTINUOUSMODE + "\r");
updateTimer.Start();
timeOut.Start();
}
else
{
this.stop = true;
//retry = false;
this.WaitEventTest.Set();
status = eventArgsStopped.Status.failed;
}
}
}
void updateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//** fire delegate that GUI will be listening to, to update graph.
List<Reading> temp = new List<Reading>(report.Readings_Force);
eventNewData(this, new eventArgsNewData(temp));
}
OriginalL'auteur TheColonel26 | 2013-08-16
Vous devez vous connecter pour publier un commentaire.
C'est bien connu comportement.
System.Timers.Timer
utilise en interneThreadPool
pour l'exécution. Runtime file d'attente de laTimer
dans le pool de threads. Il aurait déjà mis en file d'attente avant d'avoir appeléStop
méthode. Il vont faire feu sur le temps écoulé.Pour éviter que cela se définir
Timer.AutoReset
pour faux et démarrer le minuteur de retour dans le temps écoulé gestionnaire si vous en avez besoin. RéglageAutoReset
faux fait de la minuterie à feu qu'une seule fois, afin d'obtenir la minuterie tiré sur l'intervalle manuellement démarrer la minuterie de nouveau.Quelle est la raison de l'ajout de l'essayer, enfin?
Dans
try
bloc que vous pourrez ajouter à votre logique, même dans les cas d'exceptionsfinally
bloc permettra de s'assurer que yourTimer va commencer à nouveau.Je vois qui a du sens, dans mon cas, je ne veux plus jamais la minuterie pour exécuter une seule fois. J'ai décidé de changer de Système.Le filetage.Minuterie
ont une propriété nommée
AutoReset
OriginalL'auteur Sriram Sakthivel
J'ai fait une pause dans la minuterie avec ce code. pour moi qui travaille.
OriginalL'auteur Sketch