我想每晚午夜触发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
}
答案 0 :(得分:9)
FWIW,在使用计时器时,我总是将AutoReset
属性设置为false
。这可以防止计时器再次启动,因此您必须调用Timer.Start()
才能让它再次开始计数。这样可以避免额外调用Stop()
另外,为了明确,我会有一个函数,每次计算毫秒到午夜,并且每次都将它分配给计时器的间隔。会让你的代码更清晰。此外,如果您使用Timer.AutoRest = false
,则在致电Timer.Start()
之前,计时器才会开始计算,这意味着如果您将Start()
来电置于KillZombies
的末尾方法和该方法需要5秒钟才能执行,您的计时器应为86400000 - 5000
。随着时间的推移,这5秒的转变会增加。
答案 1 :(得分:4)
为什么不为Quartz.NET之类的日程管理工作量身定做更适合的事情?这样你就不用担心将Timer设置为在午夜运行然后再修改它。
如果您真的反对调度框架,可以尝试:
private void KillZombies(object source, ElapsedEventArgs e)
{
//Kill zombies
Timer.Stop();
Timer.Interval = 86400000; //Milliseconds per 24 hours
Timer.Start();
}
答案 2 :(得分:1)
首先尝试拨打Stop()
,然后再次Start()
再次呼叫。
答案 3 :(得分:1)
我不会使用如此大的间隔,而是使用可能为一秒钟(或分钟)的间隔并检查DateTime.Now
,如果已达到所需值,则开始工作。
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
}
}