Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Implementowanie interfejsu
Jeśli potrzebujesz kontroli skończonej poza podanym BackgroundServiceelementem , możesz zaimplementować własny IHostedServiceelement . Interfejs IHostedService jest podstawą dla wszystkich długotrwałych usług na platformie .NET. Implementacje niestandardowe są rejestrowane za pomocą AddHostedService<THostedService>(IServiceCollection) metody rozszerzenia.
W tym poradniku nauczysz się, jak:
- Zaimplementuj IHostedServiceinterfejsy i IAsyncDisposable .
- Utwórz usługę opartą na czasomierzu.
- Zarejestruj implementację niestandardową przy użyciu wstrzykiwania zależności i logowania.
Wskazówka
Cały przykładowy kod źródłowy "Pracownicy na platformie .NET" jest dostępny w przeglądarce Samples Browser do pobrania. Aby uzyskać więcej informacji, zobacz Przeglądanie przykładów kodu: Procesy robocze na platformie .NET.
Wymagania wstępne
- Zestaw SDK .NET 8.0 lub nowszy
- Zintegrowane środowisko projektowe (IDE) platformy .NET
- Zachęcam do korzystania z Visual Studio
Tworzenie nowego projektu
Aby utworzyć nowy projekt usługi roboczej za pomocą programu Visual Studio, wybierz plik>Nowy projekt>.... W oknie dialogowym Utwórz nowy projekt wyszukaj frazę "Usługa procesu roboczego" i wybierz pozycję Szablon usługi procesu roboczego. Jeśli wolisz użyć interfejsu wiersza polecenia platformy .NET, otwórz swój ulubiony terminal w katalogu roboczym. Uruchom polecenie dotnet new i zastąp <Project.Name> odpowiednią nazwą projektu.
dotnet new worker --name <Project.Name>
Aby uzyskać więcej informacji na temat polecenia nowego projektu usługi roboczej w CLI platformy .NET, zobacz dotnet new worker.
Wskazówka
Jeśli używasz programu Visual Studio Code, możesz uruchomić polecenia interfejsu wiersza polecenia platformy .NET z poziomu zintegrowanego terminalu. Aby uzyskać więcej informacji, zobacz Visual Studio Code: Integrated Terminal.
Tworzenie usługi czasomierza
Usługa w tle oparta na czasomierzu korzysta z klasy System.Threading.Timer. Czasomierz wyzwala metodę DoWork . Czasomierz jest wyłączony IHostLifetime.StopAsync(CancellationToken) i usuwany po usunięciu kontenera usługi w systemie IAsyncDisposable.DisposeAsync():
Zastąp zawartość Worker pliku z szablonu następującym kodem języka C#, a następnie zmień nazwę pliku na TimerService.cs:
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;
}
}
Ważne
To Worker było podklasą BackgroundService. Teraz implementuje TimerService zarówno IHostedServiceinterfejsy , jak i IAsyncDisposable .
Parametr TimerService to sealed, i kaskadowo wywołuje wywołanie DisposeAsync z jego _timer wystąpienia. Aby uzyskać więcej informacji na temat wzorca kaskadowego usuwania, zapoznaj się z Implementowaniem DisposeAsync metody.
Po wywołaniu StartAsync następuje utworzenie instancji czasomierza, co powoduje jego uruchomienie.
Wskazówka
Element Timer nie czeka na ukończenie poprzednich DoWork wykonań, więc pokazane podejście może nie być odpowiednie dla każdego scenariusza.
Interlocked.Increment Służy do przyrostowania licznika wykonywania jako operacji niepodzielnej, co gwarantuje, że wiele wątków nie jest aktualizowanych _executionCount jednocześnie.
Zastąp istniejącą Program zawartość następującym kodem języka C#:
using App.TimerHostedService;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<TimerService>();
IHost host = builder.Build();
host.Run();
Usługa jest zarejestrowana w (Program.cs) metodą rozszerzenia AddHostedService. Jest to ta sama metoda rozszerzenia używana podczas rejestrowania BackgroundService podklas, ponieważ oba te metody implementują IHostedService interfejs.
Aby uzyskać więcej informacji na temat rejestrowania usług, zapoznaj się z wstrzykiwaniem zależności na platformie .NET.
Weryfikowanie funkcjonalności usługi
Aby uruchomić aplikację z poziomu programu Visual Studio, wybierz pozycję F5 lub wybierz opcję menu Debuguj>rozpocznij debugowanie . Jeśli używasz interfejsu wiersza polecenia .NET, uruchom polecenie dotnet run z katalogu roboczego:
dotnet run
Aby uzyskać więcej informacji na temat polecenia uruchamiania interfejsu wiersza polecenia platformy .NET, zobacz dotnet run.
Pozwól aplikacji działać przez chwilę, aby wygenerować kilka inkrementacji licznika wykonań. Zostaną wyświetlone dane wyjściowe podobne do następujących:
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.
W przypadku uruchamiania aplikacji z poziomu programu Visual Studio wybierz pozycję Debuguj>Zatrzymaj debugowanie.... Alternatywnie wybierz Ctrl + C w oknie konsoli, aby zasygnalizować anulowanie.
Zobacz także
Istnieje kilka powiązanych samouczków, które należy wziąć pod uwagę: