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:
- Hatókörrel rendelkező függőségek feloldása egyetlen helyen BackgroundService.
- Munka delegálása hatókörrel rendelkező szolgáltatásba.
- Implementálja a ()<
a1/> parancsot BackgroundService.StopAsync(CancellationToken)
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
- A .NET 8.0 SDK vagy újabb verziója
- .NET integrált fejlesztési környezet (IDE)
- Nyugodtan használhatja a Visual Studiót
Ú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 BackgroundService
szolgá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 egyTask
. Bemutatás céljából a módszer tíz másodperces késéstDoWorkAsync
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
. DoWorkAsync
a következőben várt ExecuteAsync
értéket Task
adja 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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: