Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az
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 a következőket sajátíthatja el:
- 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.
Jótanács
A "Feldolgozók a .NET-ben" példaforráskódok mindegyike letölthető a Mintaböngészőben . További információért lásd: Kódrészletek böngészése: Munkavégzők a .NET-ben.
Előfeltételek
- A .NET 8.0 SDK vagy újabb
- .NET integrált fejlesztési környezet (IDE)
- Nyugodtan használhatja Visual Studio
Új projekt létrehozása
Ha új Worker Service-projektet szeretne létrehozni a Visual Studióval, válassza Fájl>Új>projekt...lehetőséget. Az Új projekt létrehozása párbeszédpanelen keresse meg a "Worker Service" kifejezést, é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> a kívánt projektnévre.
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.
Jótanács
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 ártalmatlanítva van, amikor a szolgáltatástároló ártalmatlanításra kerül IAsyncDisposable.DisposeAsync().
Cserélje le a Worker sablon tartalmát a következő C#-kódra, és nevezze át a fájlt TimerService.cs:
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 a BackgroundService egyik alosztálya volt. Most a TimerService implementálja a IHostedService, és IAsyncDisposable a interfészeket is.
Az TimerService is sealed, és kaszkádozza a DisposeAsync hívását a _timer példányából. A "kaszkádolt megsemmisítési mintával" kapcsolatos további információkért lásd a metódus implementálásának módjátDisposeAsync.
Amikor a StartAsync függvényt meghívják, az időzítő példányosításra kerül, így elindul az időzítő.
Jótanács
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ény metódus, amelyet a BackgroundService alosztályok regisztrálásakor használ, mivel mindkettő implementálja a IHostedService interfészt.
További információ a szolgáltatások regisztrálásáról: 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 CtrlC + a konzolablakban a jel törléséhez.
Lásd még
Számos kapcsolódó oktatóanyagot érdemes figyelembe venni: