Почему запуск одного сервиса запускает другие (несколько сервисов в одном exe)?

1

У меня есть проект службы 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();
    }

    ...
    ...
}
  • 1
    Если менеджер службы (управления) не показывает их как запущенные, откуда вы знаете, что они запущены?
  • 1
    Что вы имеете в виду "началось"? Получали ли другие сервисы событие Start когда не должны были? Или их код начал выполняться без получения без получения события Start ? Возможно, вы начинаете обработку в конструкторе, не дожидаясь события Start? Пожалуйста, отправьте код, который обрабатывает события Start и Stop
Показать ещё 3 комментария
Теги:
windows-services

2 ответа

1
Лучший ответ

Вы начинаете работать в конструкторе своих сервисов. Этот конструктор вызывается в вашем Main методе. Это означает, что ваш код начинает работать сразу же после запуска процесса.

Это свойство Enabled для System.Timers.Timer которое говорит, что установка его true аналогична Start() которое вызывало проблему.

  • 0
    Нашел реальную причину проблемы. Я не знал, что Enabled System.Timers.Timer также Start() это. MSDN описывает это: истина, если таймер должен вызвать событие Elapsed; иначе ложно. По умолчанию установлено значение false , что не ясно. Их раздел замечаний разъясняет это
  • 0
    Теперь я вижу ваши комментарии под вопросом. Это в основном то, что говорит этот ответ. Я добавил это ваше заявление, хотя.
Показать ещё 1 комментарий
0

Чтобы увидеть в диспетчере услуг, если остальные службы действительно запущены после запуска, вам нужно обновить представление (контекстное меню).

Что касается вашего вопроса, нет ничего плохого в вашем коде и что он должен работать:

После вызова "Выполнить" (ServiceBase []) диспетчер управления службами запускает команды START COMMANDS, что приводит к вызовам методов OnStart в службах. Службы не запускаются до тех пор, пока не будут выполнены команды "Пуск". (msdn)

Чтобы запускать службы один за другим, вам необходимо установить их отдельно и вызвать ServiceBase.Run(singleService) в каждом

  • 0
    Службы действительно работают (проверено из журнала событий), но диспетчер служб не показывает никакого состояния (попытка обновления, закрытие + повторное открытие). Если я сделаю 5 разных проектов и установлю сервисы, это точно сработает; но какой смысл в методе Run([]) тогда?
  • 0
    @mshsayem Run ([]) запускает службы одновременно, я думаю, это полезно, если вам нужно запустить сразу несколько служб, особенно если они одного типа и выполняют связанные действия на основе некоторой конфигурации и все ваши сервисы имеют один файл .exe. Вопрос: в каком классе обслуживания находится ваш метод Main ()? один из них? все они? Что вы подразумеваете под «отдельными» сервисами (я спрашиваю о функциональности)?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню