Timer.Interval问题

时间:2010-07-08 13:18:49

标签: c# timer

我想每晚午夜触发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
}

4 个答案:

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