BackgroundService in .NET Core 3.1

Neues Template: Der Workerdienst

Seit .NET Core 3.0 bietet Microsoft im Namespace Microsoft.Extensions.Hosting die Klasse BackgroundService an. Der BackgroundService ist eine Basisklasse zur Implementierung eines IHostedService mit langer Laufzeit.


In Visual Studio 2019 kann man mithilfe der Projektvorlage „Workerdienst“ sehr schnell eine Ausgangslage für das Schreiben von Dienstanwendungen mit langer Laufzeit erstellen. 


Info: Für unsere Beispiel verwenden wir .NET Core 3.1 mit der Visual Studio 2019 Version 16.4.


Schritt1: Workerdienst Template unter Dienst auswählen.


Schritt 2: Projektname und Name der Projektmappe angeben.


Schritt 3: Authentifizierung und Docker-Unterstützung werden optional angeboten. Wir verwenden allerdings für unser Beispiel die Default-Einstellungen.


Erster Rundumblick

Das Grundgerüst eines Workerdienst beinhaltet die Klasse Worker und Program.


Worker.cs

Die Klasse Worker leitet sich von der Basisklasse BackgroundService ab und bietet mithilfe der überschriebenen Methode ExecuteAsync die Möglichkeit an, dass der Host nach seiner Bereitstellung, den Dienst darüber starten kann.

Zusätzlich könnte man in der Worker-Klasse die Methode StopAsync überschreiben. Diese bietet die Möglichkeit, wenn der Anwendungshost ein ordnungsgemäßes Herunterfahren durchführt, dass dem Programmierer die Möglichkeit geboten wird, benutzerdefinierte Aufräumarbeiten durchzuführen.

Program.cs

In der Klasse Program, wird in der Main-Methode die CreateHostBuilder()-Methode parametrisiert aufgerufen.

CreateHostBuilder() erstellt den Host und konfiguriert ihn, indem AddHostService aufgerufen wird<T>, wobei T ein IHostedService ist, z. B. eine Worker-Klasse, die ein untergeordnetes Element von BackgroundService ist.


Wo ist die UseServiceBaseLifetime?

Wer schon einmal mit dem IHostBuilder unter .NET Core 2.0 / 2.1 oder in der .NET Core 3.0 Preview einen Service programmiert hat, kennt sicherlich die Methode UseServiceBaseLifetime().

In .NET Core 2.0 / 2.1 wurde für die UseServiceBaseLifetime() – Methode, den Namespace System.ServiceProcess.ServiceController angesiedelt.

In den .NET Core 3 Preview – Versionen wurde für die UseServiceBaseLifetime() der Namespace Microsoft.Extensions.Hosting.WindowsServices verschoben.

Ab der .NET Core 3.0 Release Version wurde schlussendlich die Methode UseServiceBaseLifetime() in UseWindowsService() umbenannt.

Die UseServiceBaseLifetime() regelt die Lebensdauer eines Services. In .NET Core 3.0 (Release) wird UseWindowsService() statt dessen verwendet. Auch wenn diese Methode für Windows ausgerichtet ist, wird diese bei anderen Betriebssystemen nicht beachtet.



Kleine Code Anpassung:

Für die Implementierung der UseWindowsService() Methode benötigen wir das NuGet-Paket:

Optional möchte man auch die Log-Provider benutzen und habe hierfür das EventLog Paket verwendet:


Für unser Beispiel öffnen wir die Programm.cs und fügen UseWindowsService() in der Methode CreateHostBuilder ein. Optional habe ich auch ein paar Log-Provider.



Service registrieren und starten

1.) Zuerst müssen wir das kompilierte Projekt WorkerServiceSample veröffentlichen.