Служба Windows зависла при запуске во время загрузки - PullRequest
2 голосов
/ 05 августа 2009

У нас есть две службы, разработанные в Visual Studio .NET 2008 с VB.NET. Оба были разработаны совершенно отдельно отдельными людьми (один из них сам), но оба сообщают об одной и той же ошибке во время загрузки: «служба зависла при запуске» появляется в журнале системных событий после загрузки. Службы продолжают нормально запускаться после этого сообщения (всего несколько сообщений внизу - это уведомление о запуске службы). Есть ли что-то в медленной загрузке .NET Framework или JIT-компиляции кода, вызывающего это или что? Он запускается и останавливается нормально, когда сделано вручную. Мой очень простой сервис без кода запуска, кроме того, который предоставляется фреймворком.

Обновление 1: Это все, что у меня есть в OnStart:

  host = New ServiceHost(GetType(FSE.Licensing.FSELicense))
  host.Open()

FSELicense не определяет конструктор, поэтому он просто получает пустой открытый конструктор по умолчанию, предоставляемый VB.NET, я полагаю.

Обновление 2: Мой вопрос трансформировался на основе решения, предложенного коллегой, который предположительно решил проблему. Это решение на самом деле просто добавляет зависимость от другого сервиса, который, по моему мнению, не был необходим, поскольку мой сервис ничего не делает, пока не сделан запрос. Тем не менее, он объявляет переменную типа COM. Возможно ли, что наличие ссылки на этот тип COM (даже при отсутствии экземпляра) приведет к тому, что COM DLL будет загружаться одновременно со службой и, возможно, полагаться на службу? Я не осознавал, что ссылки на COM похожи на статические ссылки в .NET, если так.

Ответы [ 4 ]

4 голосов
/ 23 декабря 2009

Я решил свою проблему, добавив в службу зависимость от службы для «HTTP SSL service» (HTTPFilter). У меня была точно такая же проблема на машине с XP со службой Windows, которую я написал в .NET, которая выставляла конечную точку WCF с помощью netpipe и http привязки. Когда система запускалась, она всегда зависала на вызове host.Open () и, в конечном итоге, зависала. Я мог бы запустить службу вручную без проблем.

См. Эту ссылку для получения инструкций по добавлению зависимости службы . Значение DependOnService, которое я использовал, было HTTPFilter

2 голосов
/ 05 мая 2010

Попробуйте свести к минимуму обработку в OnStart; в частности, избегать блокировки на неизвестное количество времени; например не пытайтесь подключить удаленные компьютеры - нет запросов к базе данных, нет запросов на обслуживание.

Если вам нужно сделать что-то, что может блокировать или иным образом занять много времени, создайте отдельный поток для этой задачи, если это возможно.

Однако вы не всегда можете избежать полной блокировки, так как вам нужно убедиться, что ваши услуги работают, когда вы вернетесь с OnStart. В таких случаях вы можете использовать ServiceBase.RequestAdditionalTime, чтобы запросить дополнительное время для завершения OnStart.

1 голос
/ 21 сентября 2011

Добавление зависимости от HTTPFilter иногда решает проблему для нас. Мы использовали этот обходной путь для некоторых систем Windows Server 2008. Эта служба HTTPFilter, по-видимому, не установлена ​​в некоторых 64-битных системах Windows 7 Professional, что фактически приведет к проблеме, из-за которой не запускается хост службы wcf (не может найти зависимость).

0 голосов
/ 06 августа 2009

Это предположение, но во время запуска системы столько вещей загружается за кулисами, что это уже замедляет процесс.

Тогда вам также придется беспокоиться о компонентах, которые зависят от запуска других служб. Например, если ваша служба использует агент SQL Server, который использует службы компонента SQL Server Database Engine, вам придется ждать загрузки в порядке зависимостей.

Итак ...

В зависимости от того, что делает FSE.Licensing.FSELicense изнутри, он может ожидать загрузки других служб, от которых зависит его загрузка, или это может быть просто из-за медленной работы машины и загрузки всех фоновых процессов. в то же время ваш сервис просто конкурирует за ресурсы со всеми этими процессами.

Однако предупреждение, которое вы видите, я просто предупреждение. Я видел это на некоторых своих сервисах, загрузка которых может занять некоторое время. Это очевидно, и мне, вероятно, даже не нужно это говорить, но диспетчер управления службами ожидает загрузки служб в течение определенного периода времени (я не уверен, что это такое), но если служба зависает, она регистрирует это сообщение, но в то же время служба все еще пытается загрузить. Пока ваша служба запускается, я не буду слишком сильно беспокоиться об этом предупреждении, если только вы не найдете способ лучше его кодировать, чтобы избежать этого.

Одна вещь, которую вы можете проверить, находится в консоли служб, посмотрите свойства вашей службы и перейдите на вкладку «Зависимости». оно может быть пустым, но может дать вам некоторое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...