Я хочу инициировать 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
}
FWIW, при использовании таймеров я всегда устанавливаю свойство AutoReset
в false
. Это предотвращает повторный запуск таймера, и вам придется вызвать Timer.Start()
, чтобы он снова начал отсчет. Это позволит избежать лишних вызовов Stop()
Кроме того, чтобы быть явным, я бы сделал функцию, которая каждый раз вычисляет миллисекунды до полуночи и каждый раз присваивает их интервалу таймера. Это сделало бы ваш код более понятным. И еще, если вы используете Timer.AutoRest = false
, таймер не начнет отсчет, пока вы не вызовете Timer. Start()
, что означает, что если вы поместите вызов Start()
в конец метода KillZombies
и этот метод займет 5 секунд на выполнение, то ваш таймер будет 86400000 - 5000
. Этот сдвиг на 5 секунд будет увеличиваться со временем.
Хммм... ...мне кажется, что это проблема планирования.
Почему бы не сделать что-то более приспособленное к планированию задач, например Quartz.NET? Так вам не придется беспокоиться о том, чтобы установить таймер на выполнение в полночь, а затем изменить его позже.
Если вы действительно против фреймворка планирования, вы можете попробовать:
private void KillZombies(object source, ElapsedEventArgs e)
{
//Kill zombies
Timer.Stop();
Timer.Interval = 86400000; //Milliseconds per 24 hours
Timer.Start();
}
Поскольку карты являются такой вездесущей структурой данных в Clojure, имеет смысл иметь несколько инструментов для работы с ними. Все различные функции синтаксически удобны в немного разных обстоятельствах.
Мое личное мнение о конкретных функциях, которые вы упомянули:
Попробуйте сначала вызвать Stop()
, затем 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
}
}