当我们需要在ASP.NET Core应用程序启动时执行一些后台任务时,我们可以使用Hosted Service。Hosted Service是一种特殊的服务,它作为后台服务在Web应用程序启动时启动,并随着应用程序的关闭而关闭。
一、创建IHostedService类
首先,我们需要创建一个实现IHostedService接口的类。该接口定义了两个方法StartAsync 和StopAsync,分别在后台服务启动和停止时被调用。
public class MyHostedService : IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
// 启动后台任务的代码
}
public Task StopAsync(CancellationToken cancellationToken)
{
// 停止后台任务的代码
}
}
二、在Startup中注册Hosted Service
要将Hosted Service注册到我们的ASP.NET Core应用程序中,我们需要在Startup的ConfigureServices方法中调用IServiceCollection的AddHostedService扩展方法。
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<MyHostedService>();
// 其他服务的注册
}
三、使用Hosted Service
通过注册Hosted Service,ASP.NET Core框架会在应用程序启动时自动创建和启动我们的实现IHostedService接口的服务对象,并在应用程序关闭时自动停止和销毁服务对象。
示例1:实现一个打印系统当前时间的Hosted Service
public class PrintTimeHostedService : IHostedService
{
private readonly ILogger<PrintTimeHostedService> _logger;
private Timer _timer;
public PrintTimeHostedService(ILogger<PrintTimeHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("PrintTimeHostedService is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("PrintTimeHostedService is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation($"The time is {DateTimeOffset.UtcNow}");
}
}
在Startup中注册该Hosted Service:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<PrintTimeHostedService>();
// 其他服务的注册
}
示例2:将Hosted Service添加到后台任务队列中执行
public class MyHostedService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(5000, stoppingToken); // 间隔5秒执行一次
// 后台任务的代码
}
}
}
在Startup中注册该Hosted Service:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<MyHostedService>();
// 其他服务的注册
}
四、注意事项
-
IHostedService不应该阻塞,否则会影响应用程序的性能和响应速度。
-
在Hosted Service中可能需要使用一些ASP.NET Core的服务,例如ILogger,可以通过将它们添加到构造函数参数中来获得依赖。
-
如果要在Hosted Service中使用数据库连接等持续性资源,应将其作为服务的依赖项进行注入,以确保资源正确地创建和释放。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何在ASP.Net Core中使用 IHostedService的方法 - Python技术站