У меня проблемы с попыткой определить причину тайм-аута в службе Windows, которую я создал с помощью C #.
Я потратил значительное количество времени на просмотр нескольких сообщений и тем по этой проблеме, но я не уверен, что еще можно попробовать.
В чем проблема?
Иногда на некоторых машинах, на которых запущена моя служба Windows, она не запускается успешно после перезагрузки машины.
Я получаю обычные сообщения EventLog о том, что служба не запускается своевременно и время ожидания истекло после 30000 миллисекунд.
Компьютеры с Windows Server 2003 кажутся наиболее распространенным шаблоном, но не всегда изолированы только от этой ОС. Например, он отлично работает на других машинах W2K3.
Ошибка запуска может быть случайной в том смысле, что иногда она запускается, а в других случаях происходит сбой, поэтому очень трудно воспроизвести проблему по требованию.
Я также использую Log4Net, чтобы ловить ошибки и регистрировать их в RollingFileAppender. Однако, когда служба не запускается, файл журнала никогда не создается и информация журнала не сохраняется.
Это как если бы мой поток входа в сервис блокируется и не вызывается.
Другие детали:
- Служба Windows написана на C # и использует .Net 2.0
- Нет других зависимостей сервиса для моего сервиса, когда
установлен.
- Служба exe является сборкой выпуска без подписи или аутентификации
подписания.
- Метод OnStart выполняется максимально быстро, создавая
Нить и запуск этой нити. Никакой другой инициализации не происходит
в пределах OnStart.
- Когда служба фактически не запускается, открытие служб
список и запуск его вручную каждый раз работает и сервис
начинается, вероятно, менее чем за секунду.
В мой 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.
Я просто жду подходящего времени простоя для доступа к клиентскому серверу, чтобы проверить эти вещи.