sooprise
sooprise

Reputation: 23177

Timer.Interval Question

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
}

Upvotes: 6

Views: 7601

Answers (4)

Tim Coker
Tim Coker

Reputation: 6524

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.

Upvotes: 9

Oliver
Oliver

Reputation: 45071

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
    }
}

Upvotes: 1

Justin Niessner
Justin Niessner

Reputation: 245389

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();
}

Upvotes: 4

SLaks
SLaks

Reputation: 887195

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

Upvotes: 1

Related Questions