2009-12-08 3 views
3

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

+0

В какой ОС работает ваш сервер? –

+0

его встроенный XP – Darkmage

+0

Работает ли он на одиночном компьютере под вашим контролем или вы собираетесь распространять его для конечных пользователей и предоставить им возможность изменять это время в ближайшем будущем (например, антивирусный пакет)? – Mayo

ответ

23

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

+0

Таким образом, ресурсы не теряются в ожидании, если вы пытаетесь постоянно поддерживать программу. – monksy

+0

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

+0

i холодный режим работы windows schefuler да, но как wold я делаю это с кодом, интересно узнать – Darkmage

0

планировщика задач Windows (как это было предложено klausbyskov) или работу SQL Server.

EDIT:

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

1

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

+1

1 секунда для того, что происходит один раз каждые 86400 секунд, является излишним! –

+1

Это оживленное ожидание. Это отличный способ тратить энергию и мощность процессора, но если Darkmage хочет использовать другие программы на своей машине, я не рекомендую это делать. –

+0

Я знаю, что это слишком много, но он начнется ровно в 03:00 ... Также 1 небольшая проверка каждую секунду не собирается тратить много сил. – DaMacc

1

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

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

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


Edit:

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

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

1

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

Рассмотрите возможность сделать System.Timers.Timer, где Interval настроен на разницу между DateTime.Now и следующими 3:00.

0

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

Лучше всего использовать cron работу, если вы на Linux/Unix/Mac OS X, планировщик задач на Windows, или launchd на более новых версиях Mac OS X.

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

0

Creating a windows server in C# довольно тривиальный и может это сделать. Просто убедитесь, что вы получили информацию о безопасности и регистрации, потому что может быть довольно сложно сказать, что происходит, пока она работает (или не работает).

1

Вот упрощенная версия сервиса, который мы писали, что работает таймер каждые 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.

3

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

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

+0

Хороший момент, плохо реализуйте план, основанный на этом и то, что говорит DaMacc. – Darkmage

1

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

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

0

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

Затем используйте Task Scheduler для запуска .bat-файла в 3 часа дня ежедневно.

Смежные вопросы