J'ai écrit une classe Timer afin de l'utiliser dans un service Windows qui interroge un autre système. Je l'ai fait parce que j'avais deux problèmes que le System.Timers.Timer
n'adresse pas. Le Elapsed EventHanler s'exécute en arrière-plan et son exécution s'interrompt si le thread principal se termine. Je voulais que la fonction System.Timers.Timer.Stop
bloque le thread principal jusqu'à la fin de l'exécution du Elapsed EventHanler. Minuteur pour un service de fenêtres d'interrogation
System.Timers.Timer
ne traite pas de la réentrance d'événement. Je veux que l'Intervalle soit entre deux EventHanler écoulés de sorte que le Timer ne puisse jamais appeler le EventHanler Elapsed si l'appel précédent (+ intervalle) n'était pas encore fini. Lors de l'écriture de la classe, j'ai découvert que je devais résoudre certains problèmes liés à la thrading et que je ne connaissais pas trop ceux que je veux savoir si la classe Timer suivante est Thread-Safe? public class Timer
{
System.Timers.Timer timer = new System.Timers.Timer() { AutoReset = false };
ManualResetEvent busy = new ManualResetEvent(true);
public double Interval
{
get { return timer.Interval; }
set { timer.Interval = value; }
}
public Timer()
{
timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
}
void TimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
busy.Reset();
OnElapsed(e);
timer.Start();
}
finally
{
busy.Set();
}
}
public event EventHandler Elapsed;
protected void OnElapsed(EventArgs e)
{
if (Elapsed != null)
{
Elapsed(this, e);
}
}
public virtual void Start()
{
busy.WaitOne();
timer.Start();
}
public virtual void Stop()
{
busy.WaitOne();
timer.Stop();
}
}
cette solution ne résout pas le problème décrit en 1. – Martin