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


Az IHostedService interfész implementálása

Ha a megadottakon BackgroundServicetúl véges vezérlésre van szüksége , saját maga is megvalósíthatja .IHostedService A IHostedService felület a .NET-ben futó összes hosszú ideig futó szolgáltatás alapja. Az egyéni implementációkat a bővítménymetódus regisztrálja AddHostedService<THostedService>(IServiceCollection) .

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

  • Implementálja a IHostedService, és IAsyncDisposable interfészeket.
  • Időzítőalapú szolgáltatás létrehozása.
  • Regisztrálja az egyéni implementációt függőséginjektálással és naplózással.

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.

Időzítőszolgáltatás létrehozása

Az időzítőalapú háttérszolgáltatás használja az osztályt System.Threading.Timer . Az időzítő aktiválja a metódust DoWork . Az időzítő le van tiltva, IHostLifetime.StopAsync(CancellationToken) és a szolgáltatástároló ártalmatlanításakor a következőre IAsyncDisposable.DisposeAsync()van kapcsolva:

Cserélje le a Worker sablon tartalmát a következő C#-kódra, és nevezze át a fájlt TimerService.cs-re:

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

Fontos

Az Worker alosztály a BackgroundService. Most a TimerService implementálja a IHostedService, és IAsyncDisposable a interfészeket is.

Az TimerService is sealed, és kaszkádozza a hívást a DisposeAsync példányból _timer . A "kaszkádolt megsemmisítési mintával" kapcsolatos további információkért lásd a metódus implementálását ismertető témakörtDisposeAsync.

Amikor StartAsync meghívja az időzítőt, a rendszer példányosít, így elindítja az időzítőt.

Tipp.

A Timer rendszer nem várja meg, amíg a korábbi végrehajtások DoWork befejeződnek, ezért előfordulhat, hogy a bemutatott megközelítés nem minden forgatókönyvhöz megfelelő. Interlocked.Increment a végrehajtási számláló atomi műveletként történő növelésére szolgál, amely biztosítja, hogy több szál ne frissüljön _executionCount egyidejűleg.

Cserélje le a meglévő Program tartalmat a következő C#-kódra:

using App.TimerHostedService;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<TimerService>();

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

A szolgáltatás regisztrálva van a (Program.cs) bővítménymetódussal AddHostedService . Ez ugyanaz a bővítménymetódus, amelyet az alosztályok regisztrálásakor BackgroundService használ, mivel mindkettő implementálja a IHostedService felületet.

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.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.

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

Számos kapcsolódó oktatóanyagot érdemes figyelembe venni: