Может ли сбой службы c #, если есть перехват всех - PullRequest
3 голосов
/ 17 августа 2011

У меня есть служба, которая запускается с помощью процедуры запуска, окруженной блоком try catch, как показано ниже.

    protected override void OnStart(string[] args)
    {
        try
        {
            Program.Start();
        }
        catch (Exception e)
        {
            Logger.Error("Exception during Service Start");
        }
    }

Иногда на некоторых машинах (1/100) иногда выводится последняя строка Program.Start (сообщение журнала), а затем происходит сбой без сообщений журнала или сообщений журнала событий. Это должно быть возможно?

Спасибо

РЕДАКТИРОВАТЬ: служба запускает несколько других потоков, но они инкапсулированы таким же образом

РЕДАКТИРОВАТЬ: Logger является оберткой для log4net - он работает очень надежно на многих (более 100) машинах (хотя да, возможно, причина)

Ответы [ 5 ]

3 голосов
/ 17 августа 2011

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

Вы добавляете обработчик для каждого необработанного исключения домена приложения?

Например:

  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( CurrentDomain_UnhandledException );

РЕДАКТИРОВАТЬ Также у вас есть событие Application.ThreadException, о котором я забыл упомянуть: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

2 голосов
/ 17 августа 2011

Да, это возможно. Например, исключение StackOverflowException не может быть перехвачено начиная с .NET 2.0 (см. статью MSDN об этом ).

2 голосов
/ 17 августа 2011

Если программа дает сбой или выдается исключение из блока try, то вы наверняка получите информацию журнала Logger.Error, но не журнал событий из системы.Если происходит сбой службы или необработанное исключение, то регистрируется только журнал событий в службе.

1 голос
/ 17 августа 2011

Можете ли вы поместить вызов вашего компонента Logger в блок try-catch и сообщить нам, что происходит?Можете ли вы контролировать свою службу без компонента Logger (т. Е. Основываясь на том выходе, который служба должна производить - например, обновления БД)?

Попробуйте записать в журнал событий напрямую, если вызов вашего Loggerкомпонент не работает.Поместите это в блок try try.Поскольку регистратор успешно записал последнюю строку в Program.Start (), это может быть связано с неудачной попыткой избавиться от ресурса или чего-то подобного, и это не регистрируется.

1 голос
/ 17 августа 2011

Мне не ясен ваш вопрос, но если вы спрашиваете, может ли ваше приложение зависнуть с таким скелетом, шансы очень малы.Так как у вас есть блок catch all, будут перехвачены почти все виды исключений, и, таким образом, ваша программа завершится изящно.

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

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