Я пишу серию сервисов Windows. Я хочу, чтобы они терпели неудачу, если ошибки запускались во время запуска (в методе OnStart()
). Я предположил, что просто сделать ошибку в OnStart()
будет делать это, но я нахожу, что вместо этого он "запускает" и представляет мне сообщение с сообщением "Служба запущена, но неактивна. Это правильно?" (Парафраз). Как обработать ошибку, чтобы на самом деле не удалось запустить службу?
Исключение справки при запуске службы
Ответ 1
если вы используете .NET 2.0 или выше, вы можете использовать ServiceBase.Stop, чтобы остановить службу из OnStart. В противном случае вызовите Stop из нового потока.
ref [devnewsgroups] (http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx)
Забастовкa >
(группа новостей ушла)
Ответ 2
Если главное, что вы хотите, для окна "Службы" сообщить, что произошла ошибка, из того, что я пробовал (.net 3.5 в Windows 7), единственный способ сделать это - установить ExitCode. Я рекомендую установить его на 13816, так как это приводит к сообщению "Неизвестная ошибка". Смотрите коды ошибок Windows.
Нижеприведенный пример выполняет три вещи. 1 - установка ExitCode приводит к полезному сообщению для конечного пользователя. Он не влияет на журнал приложений Windows, но включает сообщение в системном журнале. 2 - Вызов "Стоп" приводит к сообщению "Служба успешно остановлена" в журнале приложений. 3 - выброс исключения приводит к полезной записи журнала в журнале приложений.
protected override void OnStart(string[] args) {
try {
// Start your service
}
catch (Exception ex) {
// Log exception
this.ExitCode = 13816;
this.Stop();
throw;
}
}
Ответ 3
Переместите всю логику запуска отдельному методу и исключите исключения (или вызовите OnStop) из этого отдельного метода.
При запуске OnStart имеет некоторые странности. Я обнаружил, что если OnStart() имеет не более одной строки в нем, то я не получаю "Службу запущенную, а затем остановлен. Некоторые службы автоматически останавливаются, если у них нет работы", а заброшенные исключения прекратят обрабатывать и регистрироваться в журнале событий приложения.
Также с помощью отдельного метода запуска вы можете использовать такую технику, чтобы отлаживать ее без привязки. http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx