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