.net 托管服务已经与 Quartz区别

一、托管服务简介

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

四、例子

要实现每天早上八点查询数据库连接人数,你可以使用以下步骤:

  1. 创建一个服务类来处理数据库查询逻辑,以及查询数据库连接人数的功能。

csharpCopy code

public interface IDatabaseConnectionService {

int GetDatabaseConnectionCount();

}

public class DatabaseConnectionService : IDatabaseConnectionService {

private readonly AppDbContext _dbContext;

public DatabaseConnectionService(AppDbContext dbContext) {

_dbContext = dbContext;

}

public int GetDatabaseConnectionCount() {

// 在这里实现查询数据库连接人数的逻辑 // 返回连接人数

}

}

  1. 注册服务类:在 ASP.NET Core 的 Startup.cs 文件的 ConfigureServices 方法中将服务类注册为服务。

csharpCopy code

public void ConfigureServices(IServiceCollection services) { services.AddDbContext<AppDbContext>(options => { // 配置数据库连接字符串和选项 });

services.AddTransient<IDatabaseConnectionService, DatabaseConnectionService>(); // 注册服务类 // 省略其他配置...

}

  1. 创建一个后台服务(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);

} } }

  1. 在 Startup.cs 中注册后台服务。
 
 

csharpCopy code

public void ConfigureServices(IServiceCollection services) { // 注册数据库上下文和服务类 // 省略... // 注册后台服务 services.AddHostedService<DatabaseConnectionCheckService>(); // 省略其他配置... }

通过以上步骤,你已经实现了每天早上八点查询数据库连接人数的功能。后台服务将会在应用程序启动时自动运行,并且在每天早上八点执行数据库连接人数查询任务。你可以根据需要在任务执行时将连接人数记录到日志、发送通知或执行其他操作。

五、托管服务和 Quartz 是两种不同的技术,它们都可以用于任务调度,但有一些不同之处。

  1. 托管服务(Hosted Service)

在 ASP.NET Core 中,托管服务是一种长时间运行的任务,可以在应用程序启动时启动,并在后台执行。托管服务是通过实现 IHostedService 接口来创建的,其中包含 StartAsyncStopAsync 两个方法,用于启动和停止服务。

托管服务是一个简单的、轻量级的任务调度方式,适用于一些简单的后台任务,如周期性的数据清理、日志记录等。对于较为复杂的任务调度需求,Quartz 更为强大和灵活。

  1. Quartz

Quartz 是一个功能强大、灵活的任务调度框架,适用于各种复杂的任务调度需求。它允许你定义多种不同类型的触发器和计划任务,并能与各种存储器(如数据库)集成,实现可持久化的任务调度。Quartz 支持分布式任务调度,可以在多个节点上运行任务,并能保证任务的唯一性和一致性。

Quartz 提供了丰富的功能和配置选项,可以实现复杂的任务调度逻辑,例如定时执行、Cron 表达式触发、间隔执行等。它还支持任务的优先级、错误重试、任务监听器等特性,使得任务调度更加灵活和可靠。

总结:

  • 使用托管服务是一种简单、轻量级的任务调度方式,适用于一些简单的后台任务。
  • 使用 Quartz 是一种功能强大、灵活的任务调度框架,适用于各种复杂的任务调度需求,特别是在分布式环境下。

选择哪种方式取决于你的任务调度需求和应用程序的规模和复杂性。如果你只有简单的后台任务需求,托管服务可能已经足够;但如果你需要更灵活、功能更强大的任务调度解决方案,Quartz 是一个更好的选择。

猜你喜欢

转载自blog.csdn.net/weixin_57062986/article/details/131889177