Настраиваемая служба планировщика событий Windows

Мне нужно создать службу Windows, которая работает так же, как планировщик задач, в которой я могу настроить, в какое время она запускается, и в основном просто вызывает класс .NET в это запланированное время (повторяющееся). Каков рекомендуемый способ сделать это? Кроме того, любая информация об установке/удалении этой службы будет оценена по достоинству!

Обновление: использование планировщика задач не вариант (требование заказчика, что-то связанное с их ИТ-стандартами). Это было и моим предложением им, но оно не сработает.

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

http://www.c-sharpcorner.com/UploadFile/ajifocus/AppScheduler05262006074807AM/AppScheduler.aspx?ArticleID=b52f76da-943f-4807-9675-869f135ef2cd


person Abdullah Jibaly    schedule 22.12.2008    source источник


Ответы (8)


Вы можете попробовать планировщик заданий .NET http://TaskService.Codeplex.com. Этот проект предоставляет возможность планировать запуск сборок .NET в любое время дня с различными типами повторений, например ежедневно, ежечасно, еженедельно, каждые 5 часов или каждый третий день.

person Joseph Guadagno    schedule 09.04.2009
comment
Почему бы не использовать встроенный планировщик заданий Windows? Кажется неэффективным добавлять еще одну службу, которая делает то же самое, что и встроенная функция Windows. Делает ли TaskService на CodePlex что-то существенно отличное или лучшее, чем планировщик заданий Windows? - person Foredecker; 22.05.2010

Вы можете встроить планировщик Quartz.Net в службу.

person PeeVeeGee    schedule 25.12.2008
comment
+1 для Quartz.NET в службе Windows. Я только что реализовал его с помощью пользовательского раздела конфигурации, чтобы определить каждое из заданий, которые я хочу запустить, и использовал синтаксис cron для определения частоты каждого из них. Это работает очень хорошо. - person jeremcc; 25.12.2008

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

person Kev    schedule 22.12.2008
comment
Я согласен. Почему бы просто не создать исполняемый файл-оболочку, который вызывает ваш класс при запуске, и использовать планировщик? - person Tim; 23.12.2008

У меня была такая же проблема раньше, у планировщика задач была небольшая проблема сама по себе. Он никогда не сможет стать надежной заменой линуксовому cron. Однажды мне пришлось написать сервис, чтобы сделать именно это. У меня был System.Threading.Timer, работающий в 1-секундном цикле. Затем он проверяет события, которые необходимо запустить (внешний exe-файл), в соответствии с конфигурацией, которую я сохранил в файле xml.

person faulty    schedule 25.12.2008
comment
Расписание задач Windows — это служба. Как вы нашли это проблематичным? Он также хорошо справляется с некоторыми сложными проблемами, включая правильное выполнение процесса без повышенных прав и использование учетных данных. Насколько вы уверены, что самодельное решение или что-то вне CodePlex будет столь же безопасным и надежным, как служба задач Windows? - person Foredecker; 22.05.2010

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

Затем вы можете предоставить любую информацию, которую вам нужно предоставить, для внешнего интерфейса через службы WCF. Теперь их можно разместить в любом исполняемом файле, так что служба Windows работает просто отлично. Преимущество тактики службы Windows заключается в том, что вам не нужен рабочий стол. Запланированные задачи предназначены (или должны) выполняться в фоновом режиме. Службы Windows — хороший подход к фоновым задачам.

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

person Tim    schedule 14.12.2009

О, их так много.

Я бы начал со стандартной службы Windows в .Net и использовал функцию «Свойства\Настройки» для хранения запланированного времени (на самом деле это работает только с одним временем — более сложная конфигурация потребуется более одного раза).

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

Или вы также можете указать метод, который хотите вызвать, в файле конфигурации и использовать отражение для вызова этого метода.

person Brody    schedule 22.12.2008

Извините, мой ответ не говорит вам, как это реализовать.

Почему ваш клиент запрещает использовать некоторые встроенные функции ОС, позволяя запускать их доморощенные клоны?

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

person Wouter van Nifterick    schedule 25.12.2008

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

  • Службы труднее отлаживать, чем базовую программу пользовательского режима.
  • Службы не могут взаимодействовать с пользователем в операционных системах версии 6 и более поздних. Таким образом, вы не можете дать им консоль или вызвать всплывающие окна сообщений напрямую.
  • Связь со службами обычно осуществляется через удаленный вызов процедур или вне процесса COM. Оба могут быть сложными даже для, казалось бы, конкурирующих вещей.
  • Службы работают с большим рвением, поэтому они должны быть значительно надежнее и эффективнее, чем другие исполняемые файлы.
  • В зависимости от контекста безопасности может быть сложно заставить службу вызывать другие действия в системе.

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

person Foredecker    schedule 25.12.2008