Freigeben über


Multithreaded Services

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

Aufgrund dieses Kommunikationsmechanismus zwischen einem Dienst und dem SCM müssen Sie beim Verwenden mehrerer Threads in einem Dienst vorsichtig sein. Wenn ein Dienst angewiesen wird, den SCM zu beenden, muss er warten, bis alle Threads beendet werden, bevor der SCM gemeldet wird, dass der Dienst beendet wird. Andernfalls kann der SCM über den Status des Diensts verwechselt werden und möglicherweise nicht ordnungsgemäß heruntergefahren werden.

Der SCM muss benachrichtigt werden, dass der Dienst auf das Stoppsteuerungsereignis reagiert und dass der Fortschritt beim Beenden des Diensts vorgenommen wird. Der SCM geht davon aus, dass der Dienst fortschritte macht, wenn der Dienst innerhalb der im vorherigen Aufruf von SetServiceStatusangegebenen Zeit (Wartehinweis) reagiertund der Prüfpunkt aktualisiert wird, der im vorherigen Aufruf von SetServiceStatusangegeben ist.

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.