Вопрос

Как это сделать лучше всего?Я хочу, чтобы приложение, запущенное на сервере, запускало событие каждую ночь в 03:00.

Это было полезно?

Решение

Используйте планировщик задач Windows

Другие советы

Если вы хотите сделать это в запущенном коде приложения (вместо использования планировщика задач), вам следует выбрать достаточно длительную продолжительность ожидания вашего приложения (например, 1 час или 3600 секунд).Ваше приложение зацикливается, и по истечении срока действия каждого вызова в режиме ожидания приложение периодически проверяет, сколько времени осталось до истечения крайнего срока (03:00).Как только оставшееся время ожидания станет меньше времени грубого интервала, его следует сократить до более короткого интервала (каждый раз вдвое или до 10 секунд).Продолжайте цикл, переходя в режим ожидания и сокращая время интервала, пока не будет достигнуто целевое время крайнего срока.

Это предотвращает слишком частое пробуждение цикла (86 400 интервалов в 1 секунду - это перебор), но это также предотвращает превышение целевого срока выполнения цикла приложения из-за слишком долгого ожидания.

Вы могли бы создать таймер с интервалом в 1 секунду, и когда таймер сработает, проверьте, 3:00 ли это.

Вам нужно будет встроить его в службу, чтобы гарантировать, что он работает, даже если никто не вошел в систему на компьютере, и тогда существует множество различных методов, гарантирующих срабатывание триггера.

Подумайте о том, чтобы сделать System.Timers.Timer где находится Interval устанавливается на разницу между DateTime.Now и в следующие 3:00.

Здесь есть два основных варианта.

Если вы пытаетесь сделать это в рамках существующего сервиса, вы можете использовать Таймер запускать себя в 3:00 каждую ночь и запускать свою "задачу".

При этом, как правило, с этим лучше справляться с помощью Планировщик задач Windows.Вместо того чтобы поддерживать работоспособность приложения 24/7, вы просто запланируете его запуск один раз в день в 3:00.


Редактировать:

Если вам нужно работать с планировщиком задач из кода (упомянутого в другом комментарии), это также возможно.Планировщик задач предоставляет API для настройки отдельных Задач (Это Задание) через планировщик задач (Планировщик задач).

Однако, учитывая, что вы работаете на XP Embedded, вам, вероятно, лучше просто использовать обычные возможности настройки системы и настраивать задачу для запуска один раз в день.Во встроенной системе у вас должно быть достаточно контроля во время развертывания, чтобы сделать это.

Вот упрощенная версия сервиса, который мы написали, который запускает таймер каждые 60 секунд для просмотра таблицы...вы могли бы изменить событие истечения таймера, чтобы проверить время и запустить его затем:

Dim Timer As System.Timers.Timer

Protected Overrides Sub OnStart(ByVal args() As String)
    Timer = New System.Timers.Timer(60000)
    AddHandler Timer.Elapsed, AddressOf timer_Elapsed
    Timer.Start()
End Sub

Protected Overrides Sub OnStop()
    Timer2.Stop()
End Sub

Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
    'Ensure the tick happens in the middle of the minute
    If DateTime.Now.Second < 25 Then
        Timer.Interval = 65000
    ElseIf DateTime.Now.Second > 35 Then
        Timer.Interval = 55000
    ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
        Timer.Interval = 60000
    End If

    'Logic goes here
 End Sub

Очевидно, что если вы можете, используйте планировщик задач, как упоминали все остальные здесь.Это предпочтительный способ сделать это.У меня просто случайно оказался этот код, поэтому я решил опубликовать его на случай, если он может быть вам полезен.Кроме того, этот код работал у нас, потому что мы никогда не знали, когда внешний источник собирается отредактировать таблицу.Установка интервала на правильное количество миллисекунд была бы гораздо более эффективным способом сделать это, как указано в md5sum.

Этот ответ может быть немного левым полем, но мы часто используем CruiseControl.NET для некоторых наших запланированных задач.Это не идеально для всех, но если это большая работа, которую вы хотите выполнять каждую ночь, и от нее зависят другие коды / результаты, то это хороший выбор.Вы можете запланировать его запуск в любое время, получать электронные письма, если это сработало / не сработало.Запустите другие скрипты / код, если это не сработало, очистите нужные вам файлы перед запуском и после.

Не идеальное решение для всех ситуаций, но оно чертовски действенно для тех, кто к этому призывает.Мы используем его для некоторых наших задач по обработке больших данных, и он отправляет нам всем электронное письмо, если это сработало / не удалось, и даже повторит попытку через 30 минут, если это не удалось в первый раз.Это дает вам приятное ощущение нечеткости :)

Планировщик задач Windows (как предлагает klausbyskov) или задание SQL Server.

Редактировать:

Или, если вам нужно динамически назначенное время, вы могли бы создать службу Windows, которая опрашивает каждые 10 минут и выполняет некоторые действия в нужное время.

Создание сервера Windows на C# является довольно тривиальным и мог бы это сделать.Просто убедитесь, что вы разобрались с безопасностью и ведением журнала, потому что может быть довольно сложно определить, что происходит, пока он запущен (или не запущен).

Использование Система.Обработка потоков.Таймер.

Я создаю поток в приложении ASP.NET для выполнения запланированных задач.

Это зависит от того, что у вас есть в наличии.

Ваш лучший выбор - использовать cron ( хрон ) задание, если вы используете Linux / Unix / Mac OS X, планировщик задач в Windows или запускd в более новых версиях Mac OS X.

Если вы хотите сделать это из приложения, вам понадобится цикл, который регулярно проверяет время и запускает событие, если оно в 03:00, но это не идеально.

Может ли программа запускаться через командную строку?Если это так, создайте файл foo.bat и вызовите командную строку вашей программы (очень просто).

Затем используйте Планировщик задач чтобы запустить файл .bat в 3 часа ночи .ежедневно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top