@Aleserche
developer

Windows Service или Application?

Есть задача: программа должна выполнять какое-то действие по установленному графику.
Передо мной встал выбор. Реализовать это в виде Service или Application. Дополнительно нужно будет сделать возможным выполнять какие-то настройки (например график). Также нужно уведомлять пользователя о выполненных операциях.
Посоветуйте, как в таком случае будет правильнее всего поступить?
  • Вопрос задан
  • 518 просмотров
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C#
Тут зависит от деталей. В частности - надо ли это действие выполнять, даже если ни один пользователь не вошел в систему, или же вне контекста пользователя это бессмысленно. Если первое - тогда в общем-то лучше сервис, однако нужны дополнительные усилия, чтобы его устанавливать в систему, и, что еще важнее, из сервиса не стоит пытаться создавать окошки и вообще взаимодействовать с UI - это возможно, но сложно и требует доп. заморочек. Поэтому:
а) подумайте, выполняет ли ваше приложение какую-то глобальную задачу, не зависящую от пользователя (а-ля дефрагментация или, там, архивация). Если да, то:
б) оцените, возможно ли разбить ваше приложение на: собственно сервис, который будет выполнять полезную задачу; панель управления - обычное десктопное приложение, которое будет взаимодействовать с сервисом и менять его настройки и состояние;
в) оцените, есть ли у вас ресурсы (время/деньги), чтобы разбираться с дополнительными тонкостями (установка и запуск сервиса, особенности написания сервиса (в шарпе нужно наследоваться от библ. класса), взаимодействие UI управления и сервиса);
г) если пункты а, б, в истинны, то делайте в соответстии с ними, если хотя бы один ложный - сделайте лучше десктопное приложение.

Вообще на шарпе нормально пишутся сервисы, пробовал, разобраться можно за пару дней, включая простейшие скрипты установки.
Ответ написан
lumini
@lumini
Asp.Net DevLead
Сервис всегда работает - т.е. тратит чуть-чуть процессора и достаточно оперативной памяти. Если задача запускается раз в час и отрабатывает за минуту, то windows сервис явно излишен. Консольное приложение запускаемое по расписанию - самое то. График устанавливается через графический интерфейс Windows Scheduler, либо в случае очень нестандартного алгоритма запуска встраиванием Quartz.Net .Уведомление удобнее всего сделать в самой программе через NLog или что-то подобное. Функцию main обернуть в try/catch и в catch отправлять письмо опять же через NLog администратору об ошибке выполнения задачи.

Консольное приложение проще обновлять через FTP. Windows-сервис необходимо вначале остановить (что требует захода на сервер через удаленный рабочий стол), затем перезалить .exe, затем снова запустить сервис. Вероятнее всего, существуют средства автоматизации, но не в стандартной поставке Windows Server.

Также запуск через планировщик гарантирует на 100%, что приложение продолжит запускаться после перезагрузки сервера. С windows-сервисами были ситуации, когда сервис не стартовал, хотя в настройках был указан автозапуск.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@Sumor
Пишите консольное приложение и запускаете через AT или планировщик заданий по графику.
Если приспичит можно консольку оформить в виде сервиса с помощью SrvAny.exe или переписать как службу.
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
Обычное приложение, IMHO: меньше мороки будет как с написанием, так и с запуском.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
Если по графику, то приложение + планировщик.
Ответ написан
Комментировать
В C# можно не задумываться ;)

static void Main(string[] args)
     {
            if (!Environment.UserInteractive)
            { 
                // running as service
                using (var service = new Service())
                        ServiceBase.Run(service);
            }
            else
            {
                      // run as console programm                      
                     DoWork();
            }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы