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