C # служба Windows сразу "работает" вместо "запуска в ожидании" - PullRequest
0 голосов
/ 20 октября 2018

Я хочу написать службу Windows для инициализации аппаратного устройства при загрузке Windows.К сожалению, для инициализации требуется до 10 секунд.Поскольку от него зависит другой сервис (и он должен запускаться, если мой сервис был завершен), статус сервиса должен сохраняться на SERVICE_START_PENDING во время инициализации и меняться на SERVICE_RUNNING после того, как все было сделано.

Срок выполненияиз-за того, что я собираю данные с помощью асинхронных процессов (с событиями), я не могу выполнить всю обработку в функции OnStart.Основываясь на информации с веб-сайта Microsoft , я попытался выполнить следующую процедуру:

protected override void OnStart(string[] args)
{
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
    serviceStatus.dwWaitHint = 100000;
    serviceStatus.dwControlsAccepted = 0x00000000; // none
    serviceStatus.dwCheckPoint= 1;    // Initialize checkpoint
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);

    /* Starting the asynchronous processes */
}



void OutputDataReceived_Event(object sender, DataReceivedEventArgs e)
{
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
    serviceStatus.dwControlsAccepted = 0x00000000;
    serviceStatus.dwCheckPoint++;    // Increment checkpoint
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);

    /* Do initialization things */
    /* Call "InitializationDone()" if all was done */
}



void InitializationDone()
{
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
    serviceStatus.dwControlsAccepted = 0x00000001; // SERVICE_ACCEPT_STOP
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);
}

Однако диспетчер управления службами немедленно указывает, что моя служба имеет значение SERVICE_RUNNING после того, как метод OnStartвыполнено, что привело к слишком раннему запуску зависимой службы . Как я могу отложить статус услуги SERVICE_RUNNING?

Я уже потратил много часов на эту тему безуспешно !!

1 Ответ

0 голосов
/ 20 октября 2018

Я вижу два пути решения этой проблемы:

1) Блокировать в OnStart до тех пор, пока запуск фактически не завершится.Сервис-менеджер хорошо развит.У него должен быть какой-то способ справиться со службами, которые имеют длительное время запуска.Он должен иметь возможность запускать некоторые другие службы в paralell, если они не работают в одном экземпляре SVCHost.И даже если они выполняются в одном и том же экземпляре, сам экземпляр имеет многозадачность.

И, если есть сомнения, вы можете просто написать свой исполняемый файл, который регистрируется как serivce.Тогда никакое вмешательство не должно быть возможным.

2) Прекратите использовать Pending для передачи статуса.Обычно, если вы хотите общаться с местной службой, вы говорите, отправляя сетевые пакеты на адрес LoopbackIP.Или используйте каналы (которые делают примерно то же самое).

Просто измените Предоставляющий сервис, чтобы он мог сказать: «Я здесь, но еще не готов к обработке».Что-то, что он перестанет говорить, если его внутренний запуск завершен.

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