Dela via


Använd tjänster med avgränsat omfång inom en BackgroundService

När du registrerar implementeringar av IHostedService med hjälp av AddHostedService tilläggsmetoder 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 tutorialen lär du dig följande:

Tips/Råd

Alla exempelkällkoden "Arbetare i .NET" finns i Samples Browser för nedladdning. Mer information finns i Bläddra bland kodexempel: Arbetare i .NET.

Förutsättningar

Skapa ett nytt projekt

Om du vill skapa ett nytt Worker Service-projekt med Visual Studio väljer du File>New>Project.... I dialogrutan Skapa ett nytt projekt sök efter "Arbetstjänst" och välj Mall för arbetstjänst. Om du hellre vill använda .NET CLI öppnar du din favoritterminal i en arbetskatalog. Kör kommandot dotnet new och ersätt <Project.Name> med önskat projektnamn.

dotnet new worker --name <Project.Name>

För mer information om kommandot .NET CLI för att skapa ett nytt worker-tjänsteprojekt, se dotnet new worker.

Tips/Råd

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: Integrated Terminal.

Skapa begränsade tjänster

För att använda avgränsade tjänster inom en BackgroundService ska du skapa ett omfång med IServiceScopeFactory.CreateScope() API:et. Inget omfång skapas för en värdbaserad tjänst som standard. Den begränsade bakgrundstjänsten innehåller bakgrundsuppgiftens logik.

namespace App.ScopedService;

public interface IScopedProcessingService
{
    Task DoWorkAsync(CancellationToken stoppingToken);
}

Föregående gränssnitt definierar en enda DoWorkAsync metod. Skapa en implementering i en ny klass med namnet DefaultScopedProcessingService.cs:

namespace App.ScopedService;

public sealed class DefaultScopedProcessingService(
    ILogger<DefaultScopedProcessingService> logger) : IScopedProcessingService
{
    private readonly string _instanceId = Guid.NewGuid().ToString();

    public Task DoWorkAsync(CancellationToken stoppingToken)
    {
        logger.LogInformation(
            "{ServiceName} doing work, instance ID: {Id}",
            nameof(DefaultScopedProcessingService),
            _instanceId);

        return Task.CompletedTask;
    }
}
  • En ILogger matas in i tjänsten med hjälp av en primär konstruktor.
  • Metoden DoWorkAsync returnerar en Task och accepterar CancellationToken.
    • Metoden loggar instansidentifieraren – den _instanceId tilldelas när klassen instansieras.

Skriv om klassen Arbetare

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);

        while (!stoppingToken.IsCancellationRequested)
        {
            using IServiceScope scope = serviceScopeFactory.CreateScope();

            IScopedProcessingService scopedProcessingService =
                scope.ServiceProvider.GetRequiredService<IScopedProcessingService>();

            await scopedProcessingService.DoWorkAsync(stoppingToken);

            await Task.Delay(10_000, stoppingToken);
        }
    }

    public override async Task StopAsync(CancellationToken stoppingToken)
    {
        logger.LogInformation(
            "{Name} is stopping.", ClassName);

        await base.StopAsync(stoppingToken);
    }
}

I den föregående koden används stoppingToken för att skapa ett omfång, även om IServiceScopeFactory inte avbryts. Från IServiceScope löses IScopedProcessingService. Metoden DoWorkAsync inväntas och stoppingToken skickas till metoden. Slutligen fördröjs programkörningen med 10 sekunder och loopen fortsätter. Varje gång DoWorkAsync metoden anropas skapas en ny instans av DefaultScopedProcessingService och instansidentifieraren loggas.

Ersätt mallen Program.cs filinnehåll 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 registreras 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 du dotnet run 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 anrop till DoWorkAsyncoch därmed logga nya instansidentifierare. Du ser utdata som liknar följande loggar:

info: App.ScopedService.ScopedBackgroundService[0]
      ScopedBackgroundService is running.
info: App.ScopedService.DefaultScopedProcessingService[0]
      DefaultScopedProcessingService doing work, instance ID: 8986a86f-b444-4139-b9ea-587daae4a6dd
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 doing work, instance ID: 07a4a760-8e5a-4c0a-9e73-fcb2f93157d3
info: App.ScopedService.DefaultScopedProcessingService[0]
      DefaultScopedProcessingService doing work, instance ID: c847f432-acca-47ee-8720-1030859ce354
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.

Se även