У меня есть проект службы Windows, который состоит из 5 различных сервисов (один exe). В Main
методе я использую ServiceBase.Run([])
для регистрации тех, кто:
static void Main()
{
var servicesToRun = new ServiceBase[]
{
new ServiceA(),
new ServiceB(),
new ServiceC(),
new ServiceD(),
new ServiceE(),
};
ServiceBase.Run(servicesToRun);
}
После установки я вижу 5 различных служб в диспетчере сервисов (services.msc). Приятно, но кажется, что если я начну только сервис (скажем, serviceA), начнутся и другие 4 службы; хотя диспетчер службы не показывает статус started
с этими службами (также обновил представление). Если я вручную запустил другую службу (скажем, serviceB), а затем остановил ее, кажется, что serviceB больше не работает, но работают еще 3 службы.
Любая идея, почему это происходит?
Кстати: у всех сервисов такая схема:
public partial class ServiceA : ServiceBase
{
private static readonly Timer MyTimer = new Timer(60000);
public ServiceA()
{
InitializeComponent();
// other initializations
...
...
MyTimer.Elapsed += <DoSomeTaskFunction>
MyTimer.AutoReset = true;
MyTimer.Enabled = true;
}
protected override void OnStart(string[] args])
{
myEventLog.WriteEntry("Started...");
MyTimer.Enabled = true;
MyTimer.Start();
}
...
...
}
Вы начинаете работать в конструкторе своих сервисов. Этот конструктор вызывается в вашем Main
методе. Это означает, что ваш код начинает работать сразу же после запуска процесса.
Это свойство Enabled
для System.Timers.Timer
которое говорит, что установка его true аналогична Start()
которое вызывало проблему.
Enabled
System.Timers.Timer
также Start()
это. MSDN описывает это: истина, если таймер должен вызвать событие Elapsed; иначе ложно. По умолчанию установлено значение false , что не ясно. Их раздел замечаний разъясняет это
Чтобы увидеть в диспетчере услуг, если остальные службы действительно запущены после запуска, вам нужно обновить представление (контекстное меню).
Что касается вашего вопроса, нет ничего плохого в вашем коде и что он должен работать:
После вызова "Выполнить" (ServiceBase []) диспетчер управления службами запускает команды START COMMANDS, что приводит к вызовам методов OnStart в службах. Службы не запускаются до тех пор, пока не будут выполнены команды "Пуск". (msdn)
Чтобы запускать службы один за другим, вам необходимо установить их отдельно и вызвать ServiceBase.Run(singleService) в каждом
Run([])
тогда?
Start
когда не должны были? Или их код начал выполняться без получения без получения событияStart
? Возможно, вы начинаете обработку в конструкторе, не дожидаясь события Start? Пожалуйста, отправьте код, который обрабатывает событияStart
иStop