IHostedService là hợp đồng cho công việc chạy theo vòng đời của host: StartAsync được gọi khi app khởi động, StopAsync khi app tắt (graceful shutdown). BackgroundService là lớp trừu tượng dựng sẵn trên IHostedService, chỉ cần override ExecuteAsync.
csharp
public class OrderCleanupWorker : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await DoWorkAsync(stoppingToken);
await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
}
}
}
builder.Services.AddHostedService<OrderCleanupWorker>();Dùng cho: polling queue, dọn dữ liệu định kỳ, warm-up cache, consumer message broker.
Lưu ý:
- Phải tôn trọng stoppingToken, nếu không host sẽ chờ đủ shutdown timeout rồi kill.
- Exception không bắt trong ExecuteAsync mặc định làm dừng cả host từ .NET 6 trở đi — bọc try/catch và log.
- Worker sống trong process của web app, nên scale-out nhiều instance sẽ chạy trùng job; cần khoá phân tán hoặc tách thành worker service riêng.