Вопрос службы Windows - PullRequest
       14

Вопрос службы Windows

3 голосов
/ 14 апреля 2009

У меня есть 3 вопроса обслуживания Windows

  1. Может ли WS работать в фоновом режиме? Можно ли выполнять какую-то работу каждые 2 минуты? (если да, могу ли я получить помощь?)

  2. Как я могу установить WS простым способом? (не с Installutil.exe .......)

  3. Как запустить файл .exe из службы Windows?

Я пробовал так:

System.Diagnostics.Process G = new Process();
    G.StartInfo.FileName = @"d:\demo.exe";
    G.Start();

но это не сработало.

Ответы [ 6 ]

6 голосов
/ 14 апреля 2009
4 голосов
/ 14 апреля 2009

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

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

Что касается установки, вам следует использовать Installutil.exe - это стандартный способ установки службы Windows.

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

2 голосов
/ 14 апреля 2009
  1. Да, служба Windows может работать и работает в фоновом режиме. Для выполнения той же работы каждые 2 минуты используйте класс system.Timer и поместите свой код в событие onElapsed. Я недавно создал этот тип сервиса и обнаружил, что вы можете использовать два типа таймера, убедитесь, что вы используете правильный, иначе вы не найдете событие onElapsed.

  2. Я не пробовал устанавливать без InstallUtil.exe, но у меня есть файл .bat, который я использую, который запускается как часть моей основной установки приложения.

Ваш дополнительный вопрос о запуске .exe из службы Windows, чтобы запустить .exe из службы Windows, которую я использовал:

Process p = new Process();
p.StartInfo.WorkingDirectory = @"C:\";
p.StartInfo.FileName = @"C:\demo.exe";
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();

Помните, что исполняемый файл будет работать на том же уровне, что и служба, что означает, что он не может ничего отображать на рабочем столе. Если вы ожидаете увидеть какое-либо открытое окно или .exe требует ввода данных пользователем, вы будете разочарованы, и .exe может ждать бесконечно долго. (Я нашел эту ссылку Запуск внешних программ помог и есть также этот вопрос на SO - Запуск приложения (.EXE) из C # )

2 голосов
/ 14 апреля 2009

Если вы разрабатываете с VS2008, у вас есть шаблон для создания служб Windows.

По сути, вы создадите Timer (System.Windows.Timers.Timer), выполните инициализацию с помощью метода OnStart, очистите и завершите работу с методом OnStop и инициализируете Timer (OnStart или OnCommand). )

Вы можете посмотреть на это для базового примера или здесь, для примера с таймерами

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

1 голос
/ 14 апреля 2009

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

Вот старая статья, описывающая использование sc.exe. Также просто запуск sc из командной строки покажет возможные команды.

0 голосов
/ 14 апреля 2009

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

...