Dienste programmieren mit .NET

Dienste unter .NET

Ein Windows-Dienst, der auf der ".NET Service Klasse" basiert, hat mindestens zwei Methoden: OnStart() undOnStop(). OnStart wird beim Start des Dienstes aufgerufen - im Falle eines Autostart-Dienstes also beim Start des Rechners. OnStop kommt zum Einsatz, wenn der Dienst beendet wird, sei es durch Herunterfahren des Rechners oder über das Dienste-Applet der Systemsteuerung.

Der Service Control Manager kümmert sich darum, dass die beiden Methoden OnStart und OnStop aufgerufen werden: Wie aber stellt man dann den eigentlichen Dienst zur Verfügung? In der Methode OnStart() kann man das nicht tun, denn dann würde die Methode nicht terminieren und der Service Control Manager würde das als ein Fehlschlagen des Dienstestarts interpretieren. In OnStop() hingegen ist es zu spät, noch irgendwelche Aktionen durchzuführen: Es macht schließlich wenig Sinn, die Dienste erst anzubieten, wenn der Rechner gerade dabei ist, heruntergefahren zu werden.

Anderer Code wird aber nicht aufgerufen - ein Dienst hat keine Funktion main() oder einen ähnlichen Eintrittspunkt. Alles was es gibt, ist eben OnStart(). Man braucht also einen Weg, um in dieser Methode Code auszuführen, der so lange läuft, bis er in OnStop() angehalten wird. Die Lösung ist einfach: Man öffnet in OnStart() einen zusätzlichen Thread, den man in OnStop() wieder schließt.