Как уже было сказано, не помещайте свой код в OnStart (). Зачем? Потому что, если ваш метод OnStart () не возвращается быстро, менеджер сервиса помечает ваш сервис как не отвечающий и отключит вас.
Итак, я помещаю свой код в метод Start (), и все, что OnStart () делает, это вызывает Start (). Вот так:
protected override void OnStart(string[] args)
{
Start();
}
public static void Start()
{
... do stuff
}
Также помните, что ваш код для запуска службы будет вести себя по-разному в зависимости от того, находитесь ли вы в режиме компиляции или отладки.
System.ServiceProcess.ServiceBase[] ServicesToRun;
// Change the following line to match.
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
Я делаю это, чтобы убедиться, что он ведет себя правильно, и мне не нужно помнить, чтобы изменить код вперед и назад для запуска или отладки.
if(Debugger.IsAttached)
Service.Start();
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service()
};
ServiceBase.Run(ServicesToRun);
}