Använda begränsade tjänster inom en BackgroundService
När du registrerar implementeringar av IHostedService att använda någon av tilläggsmetoderna AddHostedService registreras tjänsten som en singleton. Det kan finnas scenarier där du vill förlita dig på en begränsad tjänst. Mer information finns i Beroendeinmatning i .NET: Tjänstens livslängd.
I den här självstudien lär du dig att:
- Lös begränsade beroenden i en singleton BackgroundService.
- Delegera arbete till en begränsad tjänst.
- Implementera en
override
av BackgroundService.StopAsync(CancellationToken).
Dricks
Alla exempelkällkoden "Arbetare i .NET" finns i exempelwebbläsaren för nedladdning. Mer information finns i Bläddra bland kodexempel: Arbetare i .NET.
Förutsättningar
- .NET 8.0 SDK eller senare
- En .NET-integrerad utvecklingsmiljö (IDE)
- Använd gärna Visual Studio
Skapa ett nytt projekt
Om du vill skapa ett nytt Worker Service-projekt med Visual Studio väljer du Nytt>>filprojekt....I dialogrutan Skapa ett nytt projekt söker du efter "Arbetstjänst" och väljer Mall för Arbetstjänst. Om du hellre vill använda .NET CLI öppnar du din favoritterminal i en arbetskatalog. dotnet new
Kör kommandot och ersätt <Project.Name>
med önskat projektnamn.
dotnet new worker --name <Project.Name>
Mer information om kommandot .NET CLI new worker service project finns i dotnet new worker( dotnet new worker).
Dricks
Om du använder Visual Studio Code kan du köra .NET CLI-kommandon från den integrerade terminalen. Mer information finns i Visual Studio Code: Integrerad terminal.
Skapa begränsade tjänster
Om du vill använda begränsade tjänster inom en BackgroundService
skapar du ett omfång. Inget omfång skapas för en värdbaserad tjänst som standard. Den begränsade bakgrundstjänsten innehåller bakgrundsaktivitetens logik.
namespace App.ScopedService;
public interface IScopedProcessingService
{
Task DoWorkAsync(CancellationToken stoppingToken);
}
Föregående gränssnitt definierar en enda DoWorkAsync
metod. Så här definierar du standardimplementeringen:
- Tjänsten är asynkron. Metoden
DoWorkAsync
returnerar enTask
. I demonstrationssyfte väntar en fördröjning på tio sekunder iDoWorkAsync
metoden. - En ILogger matas in i tjänsten.:
namespace App.ScopedService;
public sealed class DefaultScopedProcessingService(
ILogger<DefaultScopedProcessingService> logger) : IScopedProcessingService
{
private int _executionCount;
public async Task DoWorkAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
++ _executionCount;
logger.LogInformation(
"{ServiceName} working, execution count: {Count}",
nameof(DefaultScopedProcessingService),
_executionCount);
await Task.Delay(10_000, stoppingToken);
}
}
}
Den värdbaserade tjänsten skapar ett omfång för att matcha den begränsade bakgrundstjänsten för att anropa dess DoWorkAsync
metod. DoWorkAsync
returnerar en Task
, som väntar i ExecuteAsync
:
Skriv om klassen Worker
Ersätt den befintliga Worker
klassen med följande C#-kod och byt namn på filen till ScopedBackgroundService.cs:
namespace App.ScopedService;
public sealed class ScopedBackgroundService(
IServiceScopeFactory serviceScopeFactory,
ILogger<ScopedBackgroundService> logger) : BackgroundService
{
private const string ClassName = nameof(ScopedBackgroundService);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Name} is running.", ClassName);
await DoWorkAsync(stoppingToken);
}
private async Task DoWorkAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Name} is working.", ClassName);
using (IServiceScope scope = serviceScopeFactory.CreateScope())
{
IScopedProcessingService scopedProcessingService =
scope.ServiceProvider.GetRequiredService<IScopedProcessingService>();
await scopedProcessingService.DoWorkAsync(stoppingToken);
}
}
public override async Task StopAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Name} is stopping.", ClassName);
await base.StopAsync(stoppingToken);
}
}
I föregående kod skapas ett explicit omfång och implementeringen IScopedProcessingService
löses från omfångsfabriken för beroendeinmatningstjänsten. Den lösta tjänstinstansen är begränsad och dess DoWorkAsync
metod väntar.
Ersätt mallen Program.cs-filinnehållet med följande C#-kod:
using App.ScopedService;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<ScopedBackgroundService>();
builder.Services.AddScoped<IScopedProcessingService, DefaultScopedProcessingService>();
IHost host = builder.Build();
host.Run();
Tjänsterna är registrerade i (Program.cs). Den värdbaserade tjänsten är registrerad med AddHostedService
tilläggsmetoden.
Mer information om hur du registrerar tjänster finns i Beroendeinmatning i .NET.
Verifiera tjänstfunktioner
Om du vill köra programmet från Visual Studio väljer du F5 eller väljer menyalternativet Felsök>startfelsökning. Om du använder .NET CLI kör dotnet run
du kommandot från arbetskatalogen:
dotnet run
Mer information om körningskommandot för .NET CLI finns i dotnet run.
Låt programmet köras en stund för att generera flera steg för körningsantal. Du ser utdata som liknar följande:
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is running.
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is working.
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService working, execution count: 1
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: .\scoped-service
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService working, execution count: 2
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService working, execution count: 3
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService working, execution count: 4
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is stopping.
Om du kör programmet inifrån Visual Studio väljer du Felsöka>Sluta felsöka.... Du kan också välja Ctrl + C i konsolfönstret för att signalera annullering.