Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Timer.Interval Question

Tags:

c#

timer

I want to trigger KillZombies every night at midnight. The problem I'm having is that the first timer interval is retained and not reset to 86400000 milliseconds as I'm trying to do in my method.

Is there any way to remove the old interval and replace it with a new one?

System.Timers.Timer Timer = new System.Timers.Timer();
Timer.Elapsed += new ElapsedEventHandler(KillZombies);
Timer.Interval = MillisecondsToMidnight;
Timer.Start()

private void KillZombies(object source, ElapsedEventArgs e)
{
//Kill zombies
Timer.Interval = 86400000; //Milliseconds per 24 hours
}
like image 703
sooprise Avatar asked Jul 08 '10 13:07

sooprise


4 Answers

FWIW, when using Timers, I always set the AutoReset property to false. This prevents the timer from starting up again, so you have to call Timer.Start() to get it to start counting again. This would avoid the extra calls to Stop()

Also, to be explicit, I would have a function that calculates milliseconds to midnight each time and assign that to the timer's interval every time. Would make your code more clear. And also, if you use Timer.AutoRest = false, the timer won't start counting until you call Timer.Start(), which means if you put the Start() call at the end of your KillZombies method and that method takes 5 seconds to execute, your timer should then be 86400000 - 5000. That 5 second shift would add up over time.

like image 172
Tim Coker Avatar answered Nov 10 '22 07:11

Tim Coker


Hmmmm...seems like a scheduling problem to me.

Why not something a little more tailored to scheduling tasks like Quartz.NET? That way you don't have to worry about setting a Timer to run at midnight and then modifying it later.

If you're truly opposed to a scheduling framework, you could try:

private void KillZombies(object source, ElapsedEventArgs e)
{
    //Kill zombies
    Timer.Stop();
    Timer.Interval = 86400000; //Milliseconds per 24 hours
    Timer.Start();
}
like image 29
Justin Niessner Avatar answered Nov 10 '22 05:11

Justin Niessner


Try calling Stop() first, then Start()ing it again.

like image 1
SLaks Avatar answered Nov 10 '22 06:11

SLaks


Instead of using such a big interval i would instead use an Interval of maybe one second (or minute) and check DateTime.Now and if it has reached the desired value start the work.

System.Timers.Timer Timer = new System.Timers.Timer();
Timer.Elapsed += new ElapsedEventHandler(KillZombies);
Timer.Interval = 60000;
Timer.Start()

private void KillZombies(object source, ElapsedEventArgs e)
{
    if((DateTime.Now - DateTime.Today) < new TimeSpan(0, 1, 0))
    {
        //ToDo: Kill Zombies
    }
}
like image 1
Oliver Avatar answered Nov 10 '22 06:11

Oliver