定时器.间隔问题
我想每天晚上午夜触发 KillZombies。 我遇到的问题是,第一个计时器间隔被保留,并且没有像我在方法中尝试执行的那样重置为 86400000 毫秒。
有没有办法删除旧的间隔并用新的间隔替换?
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
}
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
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
嗯……对我来说似乎是一个日程安排问题。
为什么不做一些更适合调度任务的东西,比如 Quartz.NET?这样您就不必担心将计时器设置为在午夜运行然后稍后对其进行修改。
如果您确实反对调度框架,您可以尝试:
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:
尝试先调用
Stop()
,然后再次调用Start()
。Try calling
Stop()
first, thenStart()
ing it again.我不会使用这么大的间隔,而是使用大约一秒(或一分钟)的间隔并检查 DateTime.Now ,如果它已达到所需的值,则开始工作。
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.FWIW,当使用计时器时,我总是将 AutoReset 属性设置为 false。这会阻止计时器再次启动,因此您必须调用 Timer.Start() 才能使其再次开始计数。这将避免对
Stop()
的额外调用另外,明确地说,我将有一个函数每次计算到午夜的毫秒数,并将其分配给计时器的间隔。会让你的代码更加清晰。而且,如果您使用
Timer.AutoRest = false
,计时器将不会开始计数,直到您调用Timer.Start()
,这意味着如果您将>Start()
在KillZombies
方法末尾调用,并且该方法需要 5 秒才能执行,那么您的计时器应为86400000 - 5000
。随着时间的推移,这 5 秒的轮班时间会累积起来。FWIW, when using Timers, I always set the
AutoReset
property tofalse
. This prevents the timer from starting up again, so you have to callTimer.Start()
to get it to start counting again. This would avoid the extra calls toStop()
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 callTimer.Start()
, which means if you put theStart()
call at the end of yourKillZombies
method and that method takes 5 seconds to execute, your timer should then be86400000 - 5000
. That 5 second shift would add up over time.