Поделиться через


Многопоточные службы

Диспетчер управления службами (SCM) управляет службой, отправляя события управления службой в подпрограмму обработчика управления службы. Служба должна своевременно реагировать на события управления, чтобы SCM могли отслеживать состояние службы. Кроме того, состояние службы должно соответствовать описанию ее состояния, которое получает SCM.

Из-за этого механизма взаимодействия между службой и SCM необходимо соблюдать осторожность при использовании нескольких потоков в службе. Когда служба получает указание остановиться с помощью SCM, она должна дождаться выхода всех потоков, прежде чем сообщить SCM о том, что служба остановлена. В противном случае SCM может запутаться в состоянии службы и завершить работу неправильно.

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

Если служба сообщает SCM о том, что служба остановлена до выхода всех потоков, возможно, SCM будет интерпретировать это как противоречие. Это может привести к состоянию, в котором служба не может быть остановлена или перезапущена.