Я хочу создать второстепенного рабочего для WinForm, который инициировал код каждый раз, когда полночь протекает.
У меня есть идея того, как сделать это, но я вполне уверен, это не лучший способ сделать это.
while(1==1)
{
//if Datetime.Now == midnight, execute code
//sleep(1second)
}
Используйте System.Timers.Timer
и при запуске приложения просто вычислите разницу между DateTime.Now
и DateTime.Today.AddDays (0)
. Затем установите интервал для этой суммы.
Я недавно сделал что-то подобное:
public static class DayChangedNotifier
{
private static Timer timer;
static DayChangedNotifier()
{
timer = new Timer(GetSleepTime());
timer.Elapsed += (o, e) =>
{
OnDayChanged(DateTime.Now.DayOfWeek);
timer.Interval = this.GetSleepTime();
};
timer.Start();
SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged);
}
private static void SystemEvents_TimeChanged(object sender, EventArgs e)
{
timer.Interval = GetSleepTime();
}
private static double GetSleepTime()
{
var midnightTonight = DateTime.Today.AddDays(1);
var differenceInMilliseconds = (midnightTonight - DateTime.Now).TotalMilliseconds;
return differenceInMilliseconds;
}
private static void OnDayChanged(DayOfWeek day)
{
var handler = DayChanged;
if (handler != null)
{
handler(null, new DayChangedEventArgs(day));
}
}
public static event EventHandler<DayChangedEventArgs> DayChanged;
}
И:
public class DayChangedEventArgs : EventArgs
{
public DayChangedEventArgs(DayOfWeek day)
{
this.DayOfWeek = day;
}
public DayOfWeek DayOfWeek { get; private set; }
}
Использование: DayChangedNotified.DayChanged + = ....
Не использовать опрос. Вместо этого настройте задачу таймера, установите ее срабатывание в полночь и добавьте событие для обработки.
TimeSpan timeBetween = DateTime.Today.AddDays(1) - DateTime.Now;
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.Interval = 1000 * timeBetween.Seconds;
t.Start();
Вместо этого вы можете использовать таймер и установить интервал тика таймера как время между Now() и полночью.
вы можете использовать Quartz для планирования. Возможно, в этом сценарии он похож на пушку для убийства комара, но это единственный фреймворк для планирования заданий, который я знаю, и он отлично работает.
Я немного не понимаю, зачем вам нужен WinForm, будет ли он запущен в полночь? Если все, что вам нужно, это запустить какой-то процесс, используйте планировщик windows, чтобы запустить его в полночь. (На XP, но я думаю, что на Win server должно быть аналогично) Панель управления -> Запланированные задачи -> Добавить запланированную задачу -> Заполните мастер. Это сэкономит вам много времени на кодирование.
Я понятия не имею, почему решения для опросов были поддержаны, когда Microsoft решила этот тип проблемы много лет назад, добавив службу Windows для обработки времени. Просто создайте запланированную задачу для запуска exe. Никаких дополнительных накладных расходов.