Фоновая проверка рабочего на то, когда это - полночь?

Я хочу создать второстепенного рабочего для WinForm, который инициировал код каждый раз, когда полночь протекает.

У меня есть идея того, как сделать это, но я вполне уверен, это не лучший способ сделать это.

while(1==1)
{
//if Datetime.Now == midnight, execute code
//sleep(1second)
}
7
задан sooprise 16 June 2010 в 13:34
поделиться

6 ответов

Используйте 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 + = ....

21
ответ дан 6 December 2019 в 06:23
поделиться

Не использовать опрос. Вместо этого настройте задачу таймера, установите ее срабатывание в полночь и добавьте событие для обработки.

 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();
0
ответ дан 6 December 2019 в 06:23
поделиться

Вместо этого вы можете использовать таймер и установить интервал тика таймера как время между Now() и полночью.

7
ответ дан 6 December 2019 в 06:23
поделиться

вы можете использовать Quartz для планирования. Возможно, в этом сценарии он похож на пушку для убийства комара, но это единственный фреймворк для планирования заданий, который я знаю, и он отлично работает.

0
ответ дан 6 December 2019 в 06:23
поделиться

Я немного не понимаю, зачем вам нужен WinForm, будет ли он запущен в полночь? Если все, что вам нужно, это запустить какой-то процесс, используйте планировщик windows, чтобы запустить его в полночь. (На XP, но я думаю, что на Win server должно быть аналогично) Панель управления -> Запланированные задачи -> Добавить запланированную задачу -> Заполните мастер. Это сэкономит вам много времени на кодирование.

0
ответ дан 6 December 2019 в 06:23
поделиться

Я понятия не имею, почему решения для опросов были поддержаны, когда Microsoft решила этот тип проблемы много лет назад, добавив службу Windows для обработки времени. Просто создайте запланированную задачу для запуска exe. Никаких дополнительных накладных расходов.

0
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

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