Таймер. Вопрос об интервале

Я хочу инициировать KillZombies каждую ночь в полночь. Проблема, которую я имею, состоит в том, что интервал новичка сохраняется и не сбрасывается к 86 400 000 миллисекунд, поскольку я пытаюсь сделать в своем методе.

Там какой-либо путь состоит в том, чтобы удалить старый интервал и заменить его новым?

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
}
6
задан sooprise 8 July 2010 в 13:18
поделиться

4 ответа

FWIW, при использовании таймеров я всегда устанавливаю свойство AutoReset в false. Это предотвращает повторный запуск таймера, и вам придется вызвать Timer.Start(), чтобы он снова начал отсчет. Это позволит избежать лишних вызовов Stop()

Кроме того, чтобы быть явным, я бы сделал функцию, которая каждый раз вычисляет миллисекунды до полуночи и каждый раз присваивает их интервалу таймера. Это сделало бы ваш код более понятным. И еще, если вы используете Timer.AutoRest = false, таймер не начнет отсчет, пока вы не вызовете Timer. Start(), что означает, что если вы поместите вызов Start() в конец метода KillZombies и этот метод займет 5 секунд на выполнение, то ваш таймер будет 86400000 - 5000. Этот сдвиг на 5 секунд будет увеличиваться со временем.

9
ответ дан 8 December 2019 в 15:58
поделиться

Хммм... ...мне кажется, что это проблема планирования.

Почему бы не сделать что-то более приспособленное к планированию задач, например Quartz.NET? Так вам не придется беспокоиться о том, чтобы установить таймер на выполнение в полночь, а затем изменить его позже.

Если вы действительно против фреймворка планирования, вы можете попробовать:

private void KillZombies(object source, ElapsedEventArgs e)
{
    //Kill zombies
    Timer.Stop();
    Timer.Interval = 86400000; //Milliseconds per 24 hours
    Timer.Start();
}
4
ответ дан 8 December 2019 в 15:58
поделиться

Поскольку карты являются такой вездесущей структурой данных в Clojure, имеет смысл иметь несколько инструментов для работы с ними. Все различные функции синтаксически удобны в немного разных обстоятельствах.

Мое личное мнение о конкретных функциях, которые вы упомянули:

  • Я использую assoc для добавления одного значения в карту, заданную ключом и значением
  • Я использую merge для объединения двух карт или добавления нескольких новых записей одновременно
  • Я обычно не использую conj с картами вообще, поскольку мысленно ассоциирую ее со списками
-... 121---1089288-

Попробуйте сначала вызвать Stop(), затем Start()снова.

1
ответ дан 8 December 2019 в 15:58
поделиться

Вместо использования такого большого интервала я бы использовал интервал в одну секунду (или минуту) и проверял 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
    }
}
1
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: