Обновление:
Почти через четыре года после моего первоначального ответа, и этот ответ очень устарел. С появлением TopShelf разработка служб Windows стала легкой. Теперь вам просто нужно выяснить, как поддерживать аварийное переключение ...
Оригинальный ответ:
Я действительно не фанат Windows Scheduler. Пароль пользователя должен быть указан, как указано выше @ moodforall , что очень удобно, когда кто-то меняет пароль этого пользователя.
Другой большой недостаток планировщика Windows заключается в том, что он работает в интерактивном режиме, а не в качестве фонового процесса. Когда каждые 20 минут во время сеанса RDP появляются 15 окон MS-DOS, вы пинаете себя, что вместо этого не установили их как службы Windows.
Что бы вы ни выбрали, я, безусловно, рекомендую вам выделить код обработки в другой компонент из приложения консоли или службы Windows. Затем у вас есть выбор: либо вызвать рабочий процесс из консольного приложения и подключить его к планировщику Windows, либо использовать службу Windows.
Вы обнаружите, что планирование службы Windows - это не весело. Довольно распространенным сценарием является то, что у вас есть длительный процесс, который вы хотите периодически запускать. Но если вы обрабатываете очередь, то вам не нужно, чтобы два экземпляра одного и того же работника обрабатывали одну и ту же очередь. Таким образом, вам нужно управлять таймером, чтобы убедиться, что ваш длительный процесс запущен дольше, чем назначенный интервал таймера, он не запускается снова, пока не завершится существующий процесс.
После того, как вы написали все это, вы думаете, почему я просто не использовал Thread.Sleep? Это позволяет мне позволить текущему потоку продолжать работу до тех пор, пока он не завершится, а затем начинается интервал паузы, поток переходит в спящий режим и снова запускается через требуемое время. Ухоженная!
Затем вы читаете все советы в интернете, и многие эксперты рассказывают вам, насколько это действительно плохая практика программирования:
http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx
Так что вы почесаете голову и подумаете про себя, WTF, Отменить ожидающие проверки -> Да, я уверен -> Отменить всю сегодняшнюю работу ..... черт, черт, черт ....
Однако мне нравится этот шаблон, даже если все думают, что это дерьмо:
Метод OnStart для однопоточного подхода.
protected override void OnStart (string args) {
// Create worker thread; this will invoke the WorkerFunction
// when we start it.
// Since we use a separate worker thread, the main service
// thread will return quickly, telling Windows that service has started
ThreadStart st = new ThreadStart(WorkerFunction);
workerThread = new Thread(st);
// set flag to indicate worker thread is active
serviceStarted = true;
// start the thread
workerThread.Start();
}
Код создает отдельный поток и присоединяет нашего работника.
функция к нему. Затем он запускает поток и запускает событие OnStart.
завершено, так что Windows не думает, что служба зависла.
Рабочий метод для однопоточного подхода.
/// <summary>
/// This function will do all the work
/// Once it is done with its tasks, it will be suspended for some time;
/// it will continue to repeat this until the service is stopped
/// </summary>
private void WorkerFunction() {
// start an endless loop; loop will abort only when "serviceStarted"
// flag = false
while (serviceStarted) {
// do something
// exception handling omitted here for simplicity
EventLog.WriteEntry("Service working",
System.Diagnostics.EventLogEntryType.Information);
// yield
if (serviceStarted) {
Thread.Sleep(new TimeSpan(0, interval, 0));
}
}
// time to end the thread
Thread.CurrentThread.Abort();
}
Метод OnStop для однопоточного подхода.
protected override void OnStop() {
// flag to tell the worker process to stop
serviceStarted = false;
// give it a little time to finish any pending work
workerThread.Join(new TimeSpan(0,2,0));
}
Источник: http://tutorials.csharp -online.net / Создание_a_.NET_Windows_Service% E2% 80% 94Alternative_1% 3a_Use_a_Separate_Thread (Мертвая ссылка)
Я много лет запускал множество Windows Services, и это работает для меня. Я все еще не видел рекомендуемый образец, с которым люди соглашаются. Просто делай то, что тебе подходит.