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

Каковы наилучшие методы при запуске процесса в качестве службы Windows?

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

4b9b3361

Ответ 1

Для критических отчетов об ошибках вам необходимо использовать стандартные параметры службы (в свойствах установленной службы) или что-то делать самостоятельно. Это может быть простой файл журнала, который регистрирует непредвиденные ошибки (используя AppDomain.UnhandledException, чтобы их ловить и записывать), используя журнал событий Windows для регистрировать подобную информацию или выполнять другой процесс, наблюдая за ошибкой службы (например, остановкой службы) и предупреждая кого-либо.

В Microsoft есть статья под названием " Введение в Windows Service Applications", это хорошее общее введение в создание сервисов в .NET.

Некоторые другие аспекты разработки служб Windows из моего опыта:

  • Для запуска службы Windows требуется около 30 секунд. После этого Windows сообщит об этом, поскольку он не запущен правильно. Это означает, что вам нужно убедиться, что ваш метод OnStart службы запускает новый поток для запуска службы и затем возвращает.
  • Не ожидайте какого-либо взаимодействия с пользователем (т.е. окна сообщений, подтверждения), потому что служба запускает "безголовый" (т.е. без пользовательского интерфейса), поэтому вы не можете ожидать, что пользователь будет взаимодействовать с ним.
  • Проверьте учетную запись, с которой будет работать служба, чтобы убедиться, что вы не используете ее как пользователь с неоправданно высокими правами безопасности.
  • Широко использовать регистрацию (например, log4net), чтобы вы могли видеть, что делает служба во время выполнения, а также возможность диагностировать любые ошибки (путем регистрации трассировок стека).
  • Для установки службы убедитесь, что вы используете правильную версию InstallUtil (например, 32 или 64 бит). Еще лучше, пусть служба установит себя, используя ManagedInstallerClass.InstallHelper.

Ответ 2

  • Обязательно используйте API трассировки/ведения журнала для получения диагностической информации. Журнал событий, файлы журналов, базы данных, все, что угодно... Просто найдите информацию об устранении неполадок.
  • Trace/Log рано и часто. Ничто не является более неприятным, чем необходимость изменения кода, что просто добавляет диагностическую трассировку.
  • Будьте осведомлены о утечке памяти. При написании приложения, которое будет перезагружаться каждый день или запускается как запланированное задание, иногда мы становимся немного ленивыми. Помните, что этот сервис необходимо тщательно очистить после себя. Правильно используйте предложение use со всеми IDisposables.
  • Не забывайте ключевое слово volatile для переменной STOP! Мой Бог это каждый раз получает меня.

Ответ 3

Не показывать никаких сообщений/диалогов.

Имейте в виду, что ваше приложение, как правило, не будет работать под той же учетной записью, что и вошедший в систему пользователь. Поэтому, если пользователь имеет доступ к некоторому файлу/директории, это не означает, что служба может также работать.

Ответ 4

Удостоверьтесь, что у вас есть система оповещения, чтобы сообщить вам, если служба упадет, например. отправьте электронное письмо себе или почтовому ящику.

Ответ 5

У меня есть хороший, добавьте следующий код к вашему методу OnStart или еще лучше перед ним в вашем основном методе.

#if DEBUG
   //LogMessage("Service starting");
   #warning The service has been set to break on debug. Only used for debugging.

   //LogMessage("DEBUG MODE - If the service crashed after this then your problem is that you're running in DEBUG mode without a Visual Studio installed.");
   if (Debugger.IsAttached == false) Debugger.Launch();
#endif

В основном важная часть, если Debugger.Launch(), которая откроет окно при запуске службы и спросит вас, хотите ли вы отладить службу и с какой Visual Studio. Это делает работу с услугами потрясающей и легкой. Я помещаю #warning туда, чтобы он отображался в списке предупреждений, чтобы напомнить мне об этом, хотя #if DEBUG должен предотвратить большинство проблем.

Помните, что не нужно развертывать с запущенным этим кодом (т.е. не выпускать отладочный код), потому что он сбой, если на компьютере не установлена ​​Visual Studio.

Ответ 6

Если это имеет смысл, не забудьте реализовать событие Pause. Обращайтесь со всеми исключениями, чтобы он терпит неудачу, когда он терпит неудачу.