protected override void OnStart(string[] args)
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Thread.Sleep(10000);
throw new Exception();
}
void CurrentDomain_UnhandledException(object sender,
UnhandledExceptionEventArgs e)
{
}
Я присоединил отладчик к вышеупомянутому коду в моем сервисе окон, установив точку останова в CurrentDomain_UnhandledException, но это никогда не поражалось. Исключение открывается, говоря, что это не обработано, и затем сервисные остановки. Я даже пытался поместить некоторый код в конечном счете обработчик, в случае, если это становилось оптимизированным далеко.
Разве это не надлежащий способ настроить обработку необработанного исключения в сервисе окон?
Просто любопытно, чего вы пытаетесь достичь: избежать сбоев службы или сообщения об ошибках?
Для отчетов, я думаю, лучше всего добавить операторы try / catch верхнего уровня. Вы можете попробовать записать их в журнал событий Windows и / или в файл журнала.
Вы также можете установить для свойства ExitCode ненулевое значение, пока не остановите службу.Если системный администратор запускает вашу службу из панели управления службами, и ваша служба внезапно останавливается с ненулевым кодом выхода, Windows может показать сообщение об ошибке с описанием ошибки.
В службе Windows НЕ нужно запускать много кода в методе OnStart. Все, что вам нужно, это код для запуска вашего служебного потока, а затем возврата.
Если вы это сделаете, вы сможете без проблем обрабатывать исключения, которые происходят в вашем служебном потоке.
например.
public static void Start()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException);
running = true;
ThreadStart ts = new ThreadStart(ServiceThreadBody);
thread = new Thread(ts);
thread.Name = "ServiceThread";
thread.Priority = ThreadPriority.BelowNormal;
thread.Start();
}
Знаю, что эта ветка немного устарела, но я подумал, что было бы полезно добавить некоторые комментарии, основанные на личном опыте разработки служб Windows в .NET. Наилучший подход — по возможности избегать разработки под управлением Service Control Manager. Для этого вам понадобится простая система, которая имитирует способ запуска служб. экземпляр вашего класса обслуживания (который вы уже получили из ServiceBase) и вызовите свои методы OnStart, OnStop и т. д. Этот жгут может быть консольным приложением или приложением Windows по вашему желанию.
Это почти единственный найденный мной способ отладки проблем запуска службы в .NET — взаимодействие между вашим кодом, Visual Studio и реальным диспетчером управления службами просто делает этот процесс невозможным в противном случае.
ХТХ.