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