Megosztás a következőn keresztül:


Hatókörön belüli szolgáltatások használata BackgroundService

Amikor a bővítménymetelyek bármelyikének IHostedServiceAddHostedService használatával regisztrál implementációkat, a szolgáltatás egyszeriként lesz regisztrálva. Előfordulhatnak olyan helyzetek, amikor hatókörrel rendelkező szolgáltatásra szeretne támaszkodni. További információ: Függőséginjektálás a .NET-ben: A szolgáltatás élettartama.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

Tipp.

A "Feldolgozók a .NET-ben" példaforráskódok mindegyike letölthető a Mintaböngészőben . További információ: Kódminták tallózása: Feldolgozók a .NET-ben.

Előfeltételek

Új projekt létrehozása

Ha új Worker Service-projektet szeretne létrehozni a Visual Studióval, válassza a Fájl>új>projekt... lehetőséget. Az Új projekt létrehozása párbeszédpanelen keressen rá a "Worker Service" kifejezésre, és válassza a Worker Service sablont. Ha inkább a .NET CLI-t szeretné használni, nyissa meg kedvenc terminálját egy munkakönyvtárban. Futtassa a dotnet new parancsot, és cserélje le a <Project.Name> kívánt projektnevet.

dotnet new worker --name <Project.Name>

A .NET CLI új feldolgozói szolgáltatás projektparancsával kapcsolatos további információkért lásd: dotnet new worker.

Tipp.

Ha Visual Studio Code-ot használ, .NET CLI-parancsokat futtathat az integrált terminálról. További információ: Visual Studio Code: Integrated Terminal.

Hatókörön belüli szolgáltatások létrehozása

Hatókörön belüli BackgroundServiceszolgáltatások használatához hozzon létre egy hatókört. A rendszer alapértelmezés szerint nem hoz létre hatókört egy üzemeltetett szolgáltatáshoz. A hatókörrel rendelkező háttérszolgáltatás tartalmazza a háttérfeladat logikáját.

namespace App.ScopedService;

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

Az előző felület egyetlen DoWorkAsync metódust határoz meg. Az alapértelmezett implementáció definiálása:

  • A szolgáltatás aszinkron. A DoWorkAsync metódus egy Task. Bemutatás céljából a módszer tíz másodperces késést DoWorkAsync vár.
  • A szolgáltatásba injektálunk egy ILogger elemet:
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);
        }
    }
}

Az üzemeltetett szolgáltatás létrehoz egy hatókört, amely feloldja a hatókörrel rendelkező háttérszolgáltatást a metódus meghívásához DoWorkAsync . DoWorkAsynca következőben várt ExecuteAsyncértéket Taskadja vissza:

A Feldolgozó osztály újraírása

Cserélje le a meglévő Worker osztályt a következő C#-kódra, és nevezze át a fájlt a ScopedBackgroundService.cs fájlra:

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

Az előző kódban létrejön egy explicit hatókör, és a IScopedProcessingService végrehajtás a függőséginjektálási szolgáltatás hatókör-előállítójában lesz feloldva. A feloldott szolgáltatáspéldány hatókörrel rendelkezik, és DoWorkAsync a metódusa vár.

Cserélje le a Program.cs sablonfájl tartalmát a következő C#-kódra:

using App.ScopedService;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<ScopedBackgroundService>();
builder.Services.AddScoped<IScopedProcessingService, DefaultScopedProcessingService>();

IHost host = builder.Build();
host.Run();

A szolgáltatások regisztrálva vannak (Program.cs). A üzemeltetett szolgáltatás regisztrálva van a AddHostedService bővítménymetódussal.

A szolgáltatások regisztrálásával kapcsolatos további információkért lásd : Függőséginjektálás a .NET-ben.

A szolgáltatás működésének ellenőrzése

Ha az alkalmazást a Visual Studióból szeretné futtatni, válassza az F5 lehetőséget, vagy válassza a Hibakeresés>indítása hibakeresés menüt. Ha a .NET CLI-t használja, futtassa a dotnet run parancsot a munkakönyvtárból:

dotnet run

A .NET CLI futtatási parancsával kapcsolatos további információkért lásd : dotnet run.

Futtassa az alkalmazást egy kicsit, hogy több végrehajtási darabszám-növekményt generáljon. A következőhöz hasonló kimenet jelenik meg:

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.

Ha az alkalmazást a Visual Studióban futtatja, válassza a Hibakeresés>leállítása... lehetőséget. Másik lehetőségként válassza a Ctrl C billentyűkombinációt + a konzolablakban a jel törléséhez.

Kapcsolódó információk