C # Тайм-аут службы Windows при запуске

Мне трудно определить причину тайм-аута в службе Windows, которую я создал с помощью C #. Я потратил много времени на просмотр нескольких сообщений и тем по этой проблеме, но я не уверен, что еще попробовать.

В чем проблема?

Иногда на некоторых машинах, на которых запущена моя служба Windows, это не так. запускается успешно после перезагрузки машины. Я получаю общие сообщения EventLog о том, что служба не запускается своевременно и что время ожидания истекло через 30000 миллисекунд. Машины с Windows Server 2003 кажутся наиболее распространенным шаблоном, но не всегда изолированы только от этой ОС. Например, он отлично работает на других машинах W2K3.

Сбой при запуске может быть довольно случайным: иногда он запускается, а в других случаях завершается ошибкой, поэтому очень трудно воспроизвести проблему по запросу. Я также использую Log4Net для обнаружения ошибок и записи их в RollingFileAppender. Однако, когда служба не запускается, файл журнала не создается и информация журнала не сохраняется. Как будто мой поток входа в службу блокируется и не вызывается.

Другие подробности:

  1. Служба Windows написана на C # и использует .Net 2.0
  2. Нет других зависимостей службы для моей службы, когда установлен.
  3. Сервисный exe - это сборка выпуска без подписи или аутентификационного кода. подписание.
  4. Метод OnStart выполняется максимально быстро, создавая Тема и запуск этой темы. Никакой другой инициализации не происходит внутри OnStart.
  5. Когда служба действительно не запускается, открытие служб список и запуск вручную работает каждый раз, а служба запускается, вероятно, менее чем за секунду.

У меня есть следующий код, добавленный в мой Program.cs, который включает основную точку входа для службы. Я подключаюсь к событию UnhandledException в CurrentDomain и использую log4net для регистрации любых необработанных ошибок. Существует также попытка / уловка ServiceBase.Run на случай, если он каким-то образом выйдет из строя, чтобы я мог зарегистрировать эту ошибку.

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
        new SchedulerService() 
    };

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

    try
    {
        ServiceBase.Run(ServicesToRun);
    }
    catch (Exception ex)
    {
        Log.Fatal("Unhandled Service Exception", ex);
    }
}

private static log4net.ILog _log = null;
static log4net.ILog Log
{
    get
    {
        if (_log == null)
        {
            if (!log4net.LogManager.GetRepository().Configured)
            {
                log4net.Config.XmlConfigurator.Configure();
            }

            _log = log4net.LogManager.GetLogger(typeof(Program));
        }
        return _log;
    }
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Exception ex = e.ExceptionObject as Exception;
    if (ex == null) ex = new Exception(e.ExceptionObject.ToString());

    Log.Fatal("Unhandled Service Exception", ex);
}

Код в моей унаследованной реализации ServiceBase выглядит следующим образом:

protected override void OnStart(string[] args)
{
    Thread serviceThread = new Thread(new ThreadStart(BackgroundStart));
    serviceThread.IsBackground = true;
    serviceThread.Start();
}

private void BackgroundStart()
{
    //Initialize and start worker objects to perform monitoring...
    //<Snip>
}

Моя реализация log4net использует ConsoleAppender и RollingFileAppender, детали конфигурации которого хранятся в App.config.

На данном этапе я не уверен, что еще попробовать. Если потребуется дополнительная информация, дайте мне знать.

Спасибо.

Обновление: Просто чтобы обновить всех, я собираюсь попробовать некоторые из предложений, такие как запись в EventLog напрямую или в файл вместо Log4Net, чтобы увидеть, является ли это причиной. Я также попробую установить для параметра generatePublisherEvidence в app.config значение false.Я просто жду подходящего времени простоя для доступа к клиентскому серверу, чтобы проверить эти вещи.

16
задан Apocwhen 14 August 2011 в 20:57
поделиться