在 ASP.NET Core 应用程序中使用 BackgroundService 进行长时间运行的后台任务时,必须确保在应用程序停止时进行正常关闭和清理。通常可以通过实现 IHostedService 接口并在应用程序关闭时调用 StopAsync() 方法来实现。
以下演示了一个后台服务,该服务执行一个长时间运行的任务,每隔一段时间将数据保存到数据库中,并在应用程序停止时进行正常关闭和清理:
public class MyBackgroundService : BackgroundService
{
private readonly ILogger _logger;
public MyBackgroundService(ILogger logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogDebug("MyBackgroundService is starting.");
while (!stoppingToken.IsCancellationRequested)
{
// Do some work
await Task.Delay(TimeSpan.FromSeconds(60));
// Save data to database
_logger.LogInformation("Saving data to database.");
// ...
_logger.LogInformation("Data saved to database.");
}
_logger.LogDebug("MyBackgroundService is stopping.");
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogDebug("MyBackgroundService is stopping.");
// Do some cleanup
return base.StopAsync(cancellationToken);
}
}
在 Startup.cs 中注册 MyBackgroundService:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddHostedService();
}
使用 IHostApplicationLifetime 注册应用程序停止事件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime)
{
// ...
appLifetime.ApplicationStopping.Register(OnStopping);
}
private void OnStopping()
{
// Do some cleanup
}
这样,当应用程序收到停止信号时,将按以下顺序执行: