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
}
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.
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();
}
Try calling Stop()
first, then Start()
ing it again.
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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With