Подтвердить что ты не робот

Запланированное консольное приложение или служба Windows? Когда целесообразно использовать каждый

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

У меня есть несколько задач, которые нужно запускать с интервалами (т.е. каждые 5 минут). Какой тип проекта я должен использовать? Существуют ли примеры типов приложений, которые должны быть службами Windows?

4b9b3361

Ответ 1

Для любой запланированной задачи я обычно рекомендую службу Windows по следующим причинам:

  • Служба Windows будет работать, даже если пользователь не зашел на компьютер (будет работать, даже если сервер сидит в приглашении на вход) (*** Примечание - это может зависеть от версии Windows, в которой вы работаете).
  • Служба может работать как высокоуровневые учетные записи, такие как Сетевая служба или Локальная система, или Пользователь - у них больше конфигурации в этом отношении.
  • Служба также включает встроенные функции для запуска, остановки, перезапуска и приостановки во время работы (иногда)
  • Вы также можете настроить условия отказа для служб, например, если он не работает, он автоматически перезагружается

Что касается других примеров приложений, которые могут быть службами Windows, они много раз полезны для таких приложений, как удаленное взаимодействие - вы можете запустить службу удаленного сервера, к которому подключаются клиенты. Очевидно, очень полезно для задач обработки данных, которые вы хотите запустить в фоновом режиме, или процессов, в которых вы хотите отправить электронное письмо на определенных условиях и т.д.

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

В отношении ошибки с таймером - если вы прочитали отчет об ошибке на сайте MS, вы увидите, что это вызвано, когда вы вызываете "Остановить" внутри события Timer_Elapsed. Ответ на этот вопрос прост - не вызывайте стоп. Вместо этого заверните все это в чеке для "IsRunning" boolean и запустите только в том случае, если IsRunning является ложным. Даже если не было проблемы с таймером, вам все равно нужно сделать это, потому что таймер может перезапустить во время вашего выполнения, если ваше выполнение занимает больше времени, чем ваш интервал таймера.

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

Ответ 2

Для приложений с одним или узким назначением выполняется по расписанию, запуск консольного приложения через планировщик заданий почти всегда является правильным.

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

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

Большим фактором также является планировщик заданий - очень надежный и гибкий планировщик, основанный на событиях. Очень маловероятно, чтобы вы могли написать планировщик, который был бы более надежным и мог бы обрабатывать капризы времени и триггерного планирования. На самом деле существует ряд вопросов об использовании таймеров для планирования задач в сервисах на этом сайте, и замечательно количество ответов (включая некоторые из "правильных" ответов), которые являются низкими качествами или совершенно неверными.

EDIT: Интересно также отметить, что политика Microsoft отходит от использования сервисов для действий на основе задач. Если вы проверите Vista, Win2K8 и Win7, вы увидите растущий список запланированных задач специального назначения, которые выполняют обслуживание системы и многие системные службы.

Ответ 3

Чтобы писать, отлаживать, развертывать и поддерживать оба, я предпочитаю "Запланированные задания" далеко и далеко. Я не сомневаюсь, что есть варианты использования, когда это было бы неправильным выбором. Но для любой относительно тривиальной задачи консольное приложение, работающее как задача расписания, отлично работает.

По моему опыту, запланированные задачи чрезвычайно надежны. Я не помню ни одного сбоя, и я поддерживаю около полудюжины различных запланированных задач, которые работают от ежедневного до каждых 15 минут. (Не то, чтобы не было сбоев, но все они были проблемы с кодом или конфигурацией, и были зарегистрированы и отправлены уведомления. Проблема НИКОГДА не была связана с инфраструктурой планирования задач.)

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

Мой самый большой плюс в развертывании. Для консольных приложений просто опубликуйте EXE в правильной целевой папке. Для служб Windows вам необходимо остановить службу (используя net.exe), удалить службу (с помощью InstallUtil.exe), подождать (у меня есть спящий режим развертывания в течение 25 секунд), опубликовать EXE и затем сделать все это в обратном порядке (установить, начало).

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

Ответ 4

Это типичный случай для службы Windows, IMO.

Ответ 5

У меня есть ряд запланированных задач Windows, которые выполняются ежечасно на веб-сервере производства. Они ненадежны. Они работают в Windows 2003 Server под определенной учетной записью компьютера. В большинстве случаев они работают отлично, но иногда они не могут работать, а иногда они заканчиваются до того, как они закончатся.

Некоторые из них могут быть связаны с тем, что они являются vbscripts и способ их написания, но я видел запланированные задачи с WS FTP Pro (коммерческое программное обеспечение FTP), которые ведут себя одинаково.

Я преобразовал многие из них в службы Windows и никогда больше не беспокоился о них.

Я определенно склоняюсь к услугам Windows. Как и некоторые другие комментарии, я слишком часто сжигался в запланированных задачах Windows. Я не доверяю им решениям на уровне предприятия.

Ответ 6

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

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

Ответ 7

В большинстве случаев я бы предпочел использовать Windows-сервис.
Одна хорошая вещь при использовании запланированных задач:
Все используемые ресурсы будут выпущены после завершения запланированной задачи.

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