Dela via


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:

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

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 BackgroundServiceskapar 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 en Task. I demonstrationssyfte väntar en fördröjning på tio sekunder i DoWorkAsync 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.

Se även