Как я могу настроить.NET обработка UnhandledException в службе Windows?

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, но это никогда не поражалось. Исключение открывается, говоря, что это не обработано, и затем сервисные остановки. Я даже пытался поместить некоторый код в конечном счете обработчик, в случае, если это становилось оптимизированным далеко.

Разве это не надлежащий способ настроить обработку необработанного исключения в сервисе окон?

47
задан Jon Seigel 28 March 2010 в 20:39
поделиться

3 ответа

Просто любопытно, чего вы пытаетесь достичь: избежать сбоев службы или сообщения об ошибках?

Для отчетов, я думаю, лучше всего добавить операторы try / catch верхнего уровня. Вы можете попробовать записать их в журнал событий Windows и / или в файл журнала.

Вы также можете установить для свойства ExitCode ненулевое значение, пока не остановите службу.Если системный администратор запускает вашу службу из панели управления службами, и ваша служба внезапно останавливается с ненулевым кодом выхода, Windows может показать сообщение об ошибке с описанием ошибки.

2
ответ дан 26 November 2019 в 19:46
поделиться

В службе 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();
}
9
ответ дан 26 November 2019 в 19:46
поделиться

Знаю, что эта ветка немного устарела, но я подумал, что было бы полезно добавить некоторые комментарии, основанные на личном опыте разработки служб Windows в .NET. Наилучший подход — по возможности избегать разработки под управлением Service Control Manager. Для этого вам понадобится простая система, которая имитирует способ запуска служб. экземпляр вашего класса обслуживания (который вы уже получили из ServiceBase) и вызовите свои методы OnStart, OnStop и т. д. Этот жгут может быть консольным приложением или приложением Windows по вашему желанию.

Это почти единственный найденный мной способ отладки проблем запуска службы в .NET — взаимодействие между вашим кодом, Visual Studio и реальным диспетчером управления службами просто делает этот процесс невозможным в противном случае.

ХТХ.

5
ответ дан 26 November 2019 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: