Как и все приложения, служба Windows имеет точку входа. В C # это называется Main () и является статическим методом в некотором классе. Внутри функции Main () вашей службы Windows у вас должно быть что-то похожее на это:
ServiceBase[] ServicesToRun = new ServiceBase[] { new MyWindowsService() };
ServiceBase.Run( ServicesToRun );
В этом примере MyWindowsService
- это имя класса обслуживания Windows, который нужно запустить, и его следует заменить любым именем класса обслуживания Windows.
Когда этот код выполняется в Main (), будет вызван конструктор по умолчанию для вашего класса обслуживания Windows, который выглядит примерно так:
public MyWindowsService()
{
// service instance initialization goes here...
}
Здесь вы можете инициализировать экземпляр MyWindowsService
.
Теперь класс MyWindowsService
должен быть производным от System.ServiceProcess.ServiceBase
. Если это так, то вы можете переопределить метод OnStart (), который вызывается, когда диспетчер управления службами отправляет в службу команду запуска.
protected override void OnStart(string[] args)
{
// things to do when starting the service...
}
Как только функция OnStart () возвращается, ваша служба эффективно работает, т.е. запущена.
Итак, вопрос в том, где в этой цепочке событий происходит ваша задержка - в Main (), конструкторе службы или методе обратного вызова OnStart (). Вы пытались отладить свой сервис? Самый простой способ сделать это - поместить следующую строку кода в функцию Main () вашего сервиса:
System.Diagnostics.Debugger.Break();
Когда вы запустите службу, вам будет предложено выбрать отладчик. Просто выберите новый экземпляр Visual Studio, и вы перейдете прямо в код в тот момент, когда выполняется этот вызов Break (). Оттуда можно отлаживать, устанавливая точки останова в соответствующих местах (конструктор, OnStart ()), чтобы увидеть, где происходит зависание.