Multithreaded Services

Der Dienststeuerungs-Manager (SCM) steuert einen Dienst, indem Dienststeuerungsereignisse an die Steuerelementhandlerroutine des Diensts gesendet werden. Der Dienst muss rechtzeitig auf Steuerungsereignisse reagieren, damit der SCM den Status des Diensts nachverfolgen kann. Außerdem muss der Status des Diensts mit der Beschreibung seines Zustands übereinstimmen, den der SCM empfängt.

Aufgrund dieses Kommunikationsmechanismus zwischen einem Dienst und dem SCM müssen Sie vorsichtig sein, wenn Sie mehrere Threads in einem Dienst verwenden. Wenn ein Dienst angewiesen wird, vom SCM anzuhalten, muss er warten, bis alle Threads beendet werden, bevor er an den SCM meldet, dass der Dienst beendet wurde. Andernfalls kann der SCM über den Status des Diensts verwirrt werden und kann möglicherweise nicht ordnungsgemäß heruntergefahren werden.

Der SCM muss benachrichtigt werden, dass der Dienst auf das Ereignis der Stoppsteuerung reagiert und dass der Fortschritt beim Beenden des Diensts erfolgt. Der SCM geht davon aus, dass der Dienst Fortschritte macht, wenn der Dienst (über SetServiceStatus) innerhalb der Zeit (Wartehinweis) antwortet, die im vorherigen Aufruf von SetServiceStatus angegeben wurde, und der Prüfpunkt so aktualisiert wird, dass er größer als der prüfpunkt ist, der im vorherigen Aufruf von SetServiceStatus angegeben wurde.

Wenn der Dienst dem SCM meldet, dass der Dienst beendet wurde, bevor alle Threads beendet wurden, ist es möglich, dass der SCM dies als Widerspruch interpretiert. Dies kann zu einem Zustand führen, in dem der Dienst nicht beendet oder neu gestartet werden kann.