一、托管服务简介
1
public class DemoBgService : BackgroundService
{
private ILogger<DemoBgService> logger;
public DemoBgService(ILogger<DemoBgService> logger)
{
this.logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await Task.Delay(5000);
string s = await File.ReadAllTextAsync("d:/1.txt");
await Task.Delay(20000);
logger.LogInformation(s);
}
}
二、托管服务的异常问题
三、托管服务使用DI
四、例子
要实现每天早上八点查询数据库连接人数,你可以使用以下步骤:
- 创建一个服务类来处理数据库查询逻辑,以及查询数据库连接人数的功能。
csharpCopy code
public interface IDatabaseConnectionService {
int GetDatabaseConnectionCount();
}
public class DatabaseConnectionService : IDatabaseConnectionService {
private readonly AppDbContext _dbContext;
public DatabaseConnectionService(AppDbContext dbContext) {
_dbContext = dbContext;
}
public int GetDatabaseConnectionCount() {
// 在这里实现查询数据库连接人数的逻辑 // 返回连接人数
}
}
- 注册服务类:在 ASP.NET Core 的 Startup.cs 文件的 ConfigureServices 方法中将服务类注册为服务。
csharpCopy code
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<AppDbContext>(options => { // 配置数据库连接字符串和选项 });
services.AddTransient<IDatabaseConnectionService, DatabaseConnectionService>(); // 注册服务类 // 省略其他配置...
}
- 创建一个后台服务(Background Service)来定时执行数据库连接人数查询任务。在 ASP.NET Core 中,后台服务是一种长时间运行的任务,可以在应用程序启动时启动并在后台执行。
csharpCopy code
public class DatabaseConnectionCheckService : BackgroundService {
private readonly IDatabaseConnectionService _connectionService;
public DatabaseConnectionCheckService(IDatabaseConnectionService connectionService) {
_connectionService = connectionService;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested) {
// 获取当前时间
var currentTime = DateTime.Now;
// 比较当前时间是否是早上八点
if (currentTime.Hour == 8 && currentTime.Minute == 0) {
// 在早上八点执行数据库连接人数查询任务
int connectionCount = _connectionService.GetDatabaseConnectionCount();
// 在这里你可以将连接人数记录到日志、发送通知等
}
// 暂停一分钟后继续执行
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
} } }
- 在 Startup.cs 中注册后台服务。
csharpCopy code
public void ConfigureServices(IServiceCollection services) { // 注册数据库上下文和服务类 // 省略... // 注册后台服务 services.AddHostedService<DatabaseConnectionCheckService>(); // 省略其他配置... }
通过以上步骤,你已经实现了每天早上八点查询数据库连接人数的功能。后台服务将会在应用程序启动时自动运行,并且在每天早上八点执行数据库连接人数查询任务。你可以根据需要在任务执行时将连接人数记录到日志、发送通知或执行其他操作。
五、托管服务和 Quartz 是两种不同的技术,它们都可以用于任务调度,但有一些不同之处。
- 托管服务(Hosted Service):
在 ASP.NET Core 中,托管服务是一种长时间运行的任务,可以在应用程序启动时启动,并在后台执行。托管服务是通过实现 IHostedService
接口来创建的,其中包含 StartAsync
和 StopAsync
两个方法,用于启动和停止服务。
托管服务是一个简单的、轻量级的任务调度方式,适用于一些简单的后台任务,如周期性的数据清理、日志记录等。对于较为复杂的任务调度需求,Quartz 更为强大和灵活。
- Quartz:
Quartz 是一个功能强大、灵活的任务调度框架,适用于各种复杂的任务调度需求。它允许你定义多种不同类型的触发器和计划任务,并能与各种存储器(如数据库)集成,实现可持久化的任务调度。Quartz 支持分布式任务调度,可以在多个节点上运行任务,并能保证任务的唯一性和一致性。
Quartz 提供了丰富的功能和配置选项,可以实现复杂的任务调度逻辑,例如定时执行、Cron 表达式触发、间隔执行等。它还支持任务的优先级、错误重试、任务监听器等特性,使得任务调度更加灵活和可靠。
总结:
- 使用托管服务是一种简单、轻量级的任务调度方式,适用于一些简单的后台任务。
- 使用 Quartz 是一种功能强大、灵活的任务调度框架,适用于各种复杂的任务调度需求,特别是在分布式环境下。
选择哪种方式取决于你的任务调度需求和应用程序的规模和复杂性。如果你只有简单的后台任务需求,托管服务可能已经足够;但如果你需要更灵活、功能更强大的任务调度解决方案,Quartz 是一个更好的选择。