Фоновый работник проверяет, когда уже полночь? - PullRequest
7 голосов
/ 16 июня 2010

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

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

while(1==1)
{
//if Datetime.Now == midnight, execute code
//sleep(1second)
}

Ответы [ 6 ]

21 голосов
/ 16 июня 2010

Используйте 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;
}

AND:

public class DayChangedEventArgs : EventArgs
{
    public DayChangedEventArgs(DayOfWeek day)
    {
        this.DayOfWeek = day;
    }

    public DayOfWeek DayOfWeek { get; private set; }
}

Использование: DayChangedNotified.DayChanged += ....

7 голосов
/ 16 июня 2010

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

0 голосов
/ 16 июня 2010

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

0 голосов
/ 16 июня 2010

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

0 голосов
/ 16 июня 2010

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

 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 голосов
/ 16 июня 2010

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

...