Обработка исключений при запуске службы - PullRequest
16 голосов
/ 01 октября 2008

Я пишу серию служб Windows. Я хочу, чтобы они потерпели неудачу, если во время запуска генерируются ошибки (в методе OnStart()). Я предполагал, что это может произойти просто путем выдачи ошибки в OnStart(), но я обнаружил, что вместо этого она «запускается» и выдает мне сообщение «Служба запущена, но неактивна. Это правильно?» (Парафраз). Как мне обработать ошибку, чтобы она фактически не запускалась?

Ответы [ 3 ]

16 голосов
/ 08 августа 2012

Если главное, чтобы окно «Службы» сообщало о том, что произошла ошибка, из того, что я пробовал (.net 3.5 в Windows 7), единственный способ сделать это - установить ExitCode. Я рекомендую установить его на 13816, так как это приводит к сообщению «Произошла неизвестная ошибка». См. коды ошибок Windows .

Пример ниже выполняет три вещи. 1 - установка ExitCode приводит к полезному сообщению для конечного пользователя. Это не влияет на журнал приложений Windows, но включает в себя сообщение в системном журнале. 2 - Вызов Stop приводит к появлению сообщения «Служба успешно остановлена» в журнале приложений. 3 - создание исключения приводит к полезной записи в журнале приложений.

protected override void OnStart(string[] args) {

  try {
    // Start your service
  }
  catch (Exception ex) {
    // Log exception
    this.ExitCode = 13816;
    this.Stop();
    throw;
  }

}
8 голосов
/ 01 октября 2008

, если вы используете .NET 2.0 или выше, вы можете использовать ServiceBase.Stop , чтобы остановить службу из OnStart. В противном случае вызовите Stop из нового потока.

ref [devnewsgroups] (http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx)

(группа новостей исчезла)

7 голосов
/ 01 октября 2008

Переместите всю логику запуска в отдельный метод и создайте исключения (или вызовите OnStop) из этого отдельного метода.

У OnStart есть некоторые странности при запуске. Я обнаружил, что если OnStart () содержит не более одной строки, то я не получаю сообщение «Служба запускается, а затем останавливается. Некоторые службы автоматически останавливаются, если у них нет работы», и выданные исключения завершают обработать и войти в журнал событий приложения.

Также с помощью отдельного метода запуска вы можете использовать такую ​​технику для отладки без подключения. http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...