Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Implementieren der
Wenn Sie über die bereitgestellten BackgroundService hinaus präzise Steuerung benötigen, können Sie eigene IHostedService implementieren. Die IHostedService Schnittstelle ist die Basis für alle dienste mit langer Ausführung in .NET. Benutzerdefinierte Implementierungen werden bei der AddHostedService<THostedService>(IServiceCollection) Erweiterungsmethode registriert.
In diesem Tutorial erfahren Sie, wie:
- Implementieren Sie die IHostedService- und IAsyncDisposable-Schnittstellen.
- Erstellen Sie einen zeitgeberbasierten Dienst.
- Registrieren Sie die benutzerdefinierte Implementierung mit Abhängigkeitseinfügung und Protokollierung.
Tipp
Der Quellcode "Workers in .NET" ist im Beispielbrowser zum Herunterladen verfügbar. Weitere Informationen finden Sie unter Durchsuchen von Codebeispielen: Worker in .NET.
Voraussetzungen
- .NET 8.0 SDK oder höher
- Eine integrierte .NET-Entwicklungsumgebung (IDE)
- Sie können Visual Studio verwenden
Erstellen eines neuen Projekts
Um ein neues Worker Service-Projekt mit Visual Studio zu erstellen, wählen Sie „Datei“>„Neu“>„Projekt…“ aus. Im Dialogfeld „Neues Projekt erstellen“ suchen Sie nach „Worker Service“ und wählen die „Worker Service“-Vorlage aus. Wenn Sie lieber die .NET CLI verwenden möchten, öffnen Sie Ihr bevorzugtes Terminal in einem Arbeitsverzeichnis. Führen Sie den dotnet new Befehl aus, und ersetzen Sie <Project.Name> durch den gewünschten Projektnamen.
dotnet new worker --name <Project.Name>
Weitere Informationen zum .NET CLI-Projektbefehl für den neuen Workerdienst finden Sie unter dotnet new worker.
Tipp
Wenn Sie Visual Studio Code verwenden, können Sie .NET CLI-Befehle über das integrierte Terminal ausführen. Weitere Informationen finden Sie unter Visual Studio Code: Integrated Terminal.
Zeitgeberdienst erstellen
Der zeitgeberbasierte Hintergrunddienst verwendet die System.Threading.Timer Klasse. Der Timer löst die DoWork Methode aus. Der Timer wird durch IHostLifetime.StopAsync(CancellationToken) deaktiviert und freigegeben, wenn der Dienstcontainer durch IAsyncDisposable.DisposeAsync() freigegeben ist:
Ersetzen Sie den Inhalt der Worker Vorlage durch den folgenden C#-Code, und benennen Sie die Datei in TimerService.cs um:
namespace App.TimerHostedService;
public sealed class TimerService(ILogger<TimerService> logger) : IHostedService, IAsyncDisposable
{
private readonly Task _completedTask = Task.CompletedTask;
private int _executionCount = 0;
private Timer? _timer;
public Task StartAsync(CancellationToken stoppingToken)
{
logger.LogInformation("{Service} is running.", nameof(TimerHostedService));
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return _completedTask;
}
private void DoWork(object? state)
{
int count = Interlocked.Increment(ref _executionCount);
logger.LogInformation(
"{Service} is working, execution count: {Count:#,0}",
nameof(TimerHostedService),
count);
}
public Task StopAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Service} is stopping.", nameof(TimerHostedService));
_timer?.Change(Timeout.Infinite, 0);
return _completedTask;
}
public async ValueTask DisposeAsync()
{
if (_timer is IAsyncDisposable timer)
{
await timer.DisposeAsync();
}
_timer = null;
}
}
Von Bedeutung
Dies Worker war eine Unterklasse von BackgroundService. Jetzt implementiert die TimerService sowohl die IHostedService- als auch die IAsyncDisposable-Schnittstellen.
Das TimerService ist sealed, und kaskadiert den DisposeAsync Aufruf von seiner _timer Instanz. Weitere Informationen zum „cascading dispose pattern“ finden Sie unter Implementierung einer DisposeAsync-Methode.
Wenn StartAsync aufgerufen wird, wird der Timer instanziiert und damit gestartet.
Tipp
Timer wartet nicht auf den Abschluss vorheriger Ausführungen von DoWork. Die veranschaulichte Vorgehensweise eignet sich also möglicherweise nicht für alle Szenarios.
Interlocked.Increment wird verwendet, um den Ausführungsindikator als atomischen Vorgang zu erhöhen, wodurch sichergestellt wird, dass mehrere Threads nicht gleichzeitig aktualisiert werden _executionCount .
Ersetzen Sie den vorhandenen Program Inhalt durch den folgenden C#-Code:
using App.TimerHostedService;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<TimerService>();
IHost host = builder.Build();
host.Run();
Der Dienst wird mit der Erweiterungsmethode in (AddHostedService) registriert. Dies ist die gleiche Erweiterungsmethode, die Sie beim Registrieren von BackgroundService Unterklassen verwenden, da beide die IHostedService Schnittstelle implementieren.
Weitere Informationen zum Registrieren von Diensten finden Sie unter Dependency Injection in .NET.
Überprüfen der Dienstfunktionalität
Um die Anwendung in Visual Studio auszuführen, wählen Sie F5 aus, oder wählen Sie die Menüoption " Debuggen>starten" aus. Wenn Sie die .NET CLI verwenden, führen Sie den dotnet run Befehl aus dem Arbeitsverzeichnis aus:
dotnet run
Weitere Informationen zum .NET CLI-Ausführungsbefehl finden Sie unter dotnet run.
Lassen Sie die Anwendung ein bisschen ausführen, um mehrere Ausführungsanzahlschritte zu generieren. Der Output wird etwa wie folgt angezeigt:
info: App.TimerHostedService.TimerService[0]
TimerHostedService is running.
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\timer-service
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 1
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 2
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 3
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 4
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
info: App.TimerHostedService.TimerService[0]
TimerHostedService is stopping.
Wenn Sie die Anwendung in Visual Studio ausführen, wählen Sie "Debuggen>beenden" aus. Alternativ können Sie imKonsolenfenster STRG + C auswählen, um den Abbruch zu signalisieren.
Siehe auch
Es gibt mehrere verwandte Tutorials, die Sie in Betracht ziehen sollten.