This is well known behavior. System.Timers.Timer
internally uses ThreadPool
for execution. Runtime will queue the Timer
in threadpool. It would have already queued before you have called Stop
method. It will fire at the elapsed time.
To avoid this happening set Timer.AutoReset
to false and start the timer back in the elapsed handler if you need one. Setting AutoReset
false makes timer to fire only once, so in order to get timer fired on interval manually start timer again.
yourTimer.AutoReset = false;
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
// add your logic here
}
finally
{
yourTimer.Enabled = true;// or yourTimer.Start();
}
}