定时器.间隔问题

发布于 2024-09-08 15:28:55 字数 440 浏览 3 评论 0原文

我想每天晚上午夜触发 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

月亮邮递员 2024-09-15 15:28:56

嗯……对我来说似乎是一个日程安排问题。

为什么不做一些更适合调度任务的东西,比如 Quartz.NET?这样您就不必担心将计时器设置为在午夜运行然后稍后对其进行修改。

如果您确实反对调度框架,您可以尝试:

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

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();
}
眼中杀气 2024-09-15 15:28:56

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

Try calling Stop() first, then Start()ing it again.

枉心 2024-09-15 15:28:56

我不会使用这么大的间隔,而是使用大约一秒(或一分钟)的间隔并检查 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
    }
}

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
    }
}
一腔孤↑勇 2024-09-15 15:28:55

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 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文