#c# #.net #windows-services
#c# #.net #windows-службы #windows-services
Вопрос:
У меня есть служба C # Windows. OnStart()
Метод содержит 3 строки, которые все, что они делают, это запускают поток. Сам класс не имеет статических объектов, которые могли бы вызвать задержку. Это настолько просто, насколько может быть полезен сервис. Мой код подписан самодельным ключом.
Редактировать: я только что выяснил, что сборка не подписана, остальные подписаны. Он использует несколько сборок, которые подписаны, но сам сервис — нет.
Этот код выполняется внутри виртуальной машины, всякий раз, когда хост работает медленно, а эта виртуальная машина загружается, службе не удается запуститься с этой ошибкой:
Был достигнут тайм-аут (30000 миллисекунд) во время ожидания подключения службы ServiceName.
Установка службы на задержку запуска устраняет проблему, но это длительная задержка, и это очень раздражает. У кого-нибудь еще была эта проблема с .NET services (2.0)?
Метод OnStart при запуске:
protected override void OnStart(string[] args)
{
Thread startThread = new Thread(new ThreadStart(StartThread));
startThread.IsBackground = true;
startThread.Start();
}
Метод StartThread, в котором все, что я делаю, это вызываю другой класс, чтобы при запуске не приходилось ждать инициализации статической переменной или завершения метода конструктора.
private void StartThread()
{
Worker mainThread = new Worker(this);
mainThread.RunWorker();
}
Спасибо.
Комментарии:
1. Что делает поток? Является ли инициализация данных огромными запросами к БД? Подключается ли она к другому клиенту / серверу TCP / IP?
2. Покажите нам код в
OnStart
3. Поток выполняет много работы, но он находится в другом классе, и экземпляр класса не создается и не вызывается статически до тех пор, пока поток не будет запущен.
4. Я редактирую, чтобы добавить код.
5. @mntgoat, вы пробовали мое предложение о подписании?
Ответ №1:
Я думаю, что это, скорее всего, из-за строгой подписи имени, которая у вас есть в вашем исполняемом файле. В общем, не рекомендуется делать это с исполняемыми файлами (смотрите здесь). Я также столкнулся с той же проблемой в одном из моих проектов, где запуск исполняемого файла занял невероятное количество времени, и оказалось, что это было из-за строгой подписи имени исполняемого файла (также .NET 2.0).
Комментарии:
1. Я только что выяснил, что сборка не подписана, остальные подписаны. Она использует несколько сборок, которые подписаны, но сама служба — нет.
2. У меня есть приложение rollingfile с log4net, не уверен, что это может вызвать проблему.
3. Вы могли бы попытаться просмотреть некоторые сообщения трассировки здесь и там и попытаться увидеть, как далеко продвинулось приложение. В моем случае код onstart даже не был бы выполнен.
4. Я попробовал это с помощью регистратора, и да, даже основной метод не смог бы войти. Я действительно думаю, что это может быть из-за подписи, может быть, другие сборки, у которых есть подпись, влияют на загрузку?
5. Я попытался перенести инициализацию log4net намного позже, и это не помогло.
Ответ №2:
Подумайте о том, чтобы включить AutoLog = false. Я видел, где этот флаг может вызвать тайм-аут, который вы описываете.