Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 时间间隔问题_C#_Timer - Fatal编程技术网

C# 时间间隔问题

C# 时间间隔问题,c#,timer,C#,Timer,我想每晚午夜触发杀人僵尸。 我遇到的问题是,第一个计时器间隔被保留,而不是像我在方法中尝试做的那样重置为86400000毫秒 有没有办法去掉旧的间隔,换成新的间隔 System.Timers.Timer Timer = new System.Timers.Timer(); Timer.Elapsed += new ElapsedEventHandler(KillZombies); Timer.Interval = MillisecondsToMidnight; Timer.Start() pr

我想每晚午夜触发杀人僵尸。 我遇到的问题是,第一个计时器间隔被保留,而不是像我在方法中尝试做的那样重置为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
}

首先尝试调用
Stop()
,然后再调用
Start()

Hmmmm……对我来说,这似乎是一个调度问题

为什么不做一些更适合调度任务的事情呢?这样,您就不必担心将计时器设置为在午夜运行,然后再修改它

如果您确实反对计划框架,您可以尝试:

private void KillZombies(object source, ElapsedEventArgs e)
{
    //Kill zombies
    Timer.Stop();
    Timer.Interval = 86400000; //Milliseconds per 24 hours
    Timer.Start();
}

与其使用如此大的时间间隔,不如使用一秒钟(或一分钟)的时间间隔,然后检查
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
    }
}
System.Timers.Timer=新的System.Timers.Timer();
Timer.appead+=新的ElapsedEventHandler(杀死僵尸);
定时器间隔=60000;
Timer.Start()
私有void KillZombies(对象源,ElapsedEventArgs e)
{
if((DateTime.Now-DateTime.Today)
FWIW,在使用计时器时,我总是将
AutoReset
属性设置为
false
。这将防止计时器再次启动,因此必须调用
timer.Start()
使其再次开始计数。这将避免额外调用
Stop()


另外,明确地说,我将有一个函数,每次计算毫秒到午夜,并将其分配给计时器的时间间隔。将使您的代码更加清晰。而且,如果您使用
Timer.AutoRest=false
,计时器将不会开始计数,直到您调用
Timer.start()
,这意味着如果您将
start()
调用放在
KillZombies
方法的末尾,并且该方法需要5秒钟才能执行,那么您的计时器应该是
86400000-5000
。这5秒的轮班时间会随着时间的推移而增加。

不确定这是否正确,但我会尝试停止它,然后重置间隔,然后重新启动。@NickLarsen如果您将此作为答案而不是注释:-)放在:Timer.interval=86400000;行之后,您将击败已接受的答案<代码>停止之前,
开始
之后。你能解释一下当间隔重置时计时器停止时会发生什么,而不是在间隔重置时保持计时器运行吗?我和你的想法是一样的(显然,根据我的回答)但当我寻找一个解释,解释为什么它会使用反射器时,我发现这两种方法应该同样有效。我是否遗漏了一些明显的东西?对于我当前的项目,我需要我的杀死僵尸方法才能正常工作。我不需要运行任何其他计划任务,因此使用框架来完成一项工作似乎有点过火。我可能错了,但现在,我只需要让这件事运作起来。我会记住任何未来的项目,需要密集的调度任务(这实际上是相当有可能的)。只是想写同样的:-)累积错误,我从来没有想过。我会将代码更改为每次重新计算毫秒到午夜。谢谢