.Net Core 定时任务实现(Hangfire 和 Quartz)

技术解码器 2021-01-21 ⋅ 96 阅读

在开发过程中,我们常常需要实现定时任务来执行一些周期性的任务。这些任务可能包括数据清理、邮件发送、数据同步等。在.NET Core中,我们可以使用Hangfire和Quartz来实现定时任务。

1. Hangfire

Hangfire是一个开源的.NET库,用于实现任务调度和管理。它允许我们以简洁的方式定义和执行定时任务,并提供了丰富的功能和灵活的配置选项。下面是使用Hangfire实现定时任务的步骤:

步骤一:安装Hangfire

在Visual Studio中,打开NuGet包管理器控制台,并执行以下命令:

Install-Package Hangfire

步骤二:定义定时任务

在.NET Core应用程序的Startup.cs文件中,配置Hangfire:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddHangfire(configuration => configuration
        .UseSqlServerStorage(Configuration.GetConnectionString("Hangfire"))
        .UseRecommendedSerializerSettings()
        .UseActivator(new HangfireJobActivator(serviceProvider))
        .UseColouredConsoleLogProvider());

    // ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{
    // ...

    app.UseHangfireDashboard();

    RecurringJob.AddOrUpdate(() => Console.WriteLine("Hello, Hangfire!"), Cron.Minutely);

    // ...
}

步骤三:运行定时任务

在程序启动时,Hangfire会自动创建一个数据库表,用于存储任务信息。当定时任务执行时,Hangfire会在后台处理任务,并提供Web页面来监视和管理任务。

2. Quartz

Quartz是一个功能强大的、基于时间的作业调度库,可用于实现各种定时任务。它提供了丰富的功能,包括任务调度、错误处理、任务持久化等。下面是使用Quartz实现定时任务的步骤:

步骤一:安装Quartz

在Visual Studio中,打开NuGet包管理器控制台,并执行以下命令:

Install-Package Quartz

步骤二:定义定时任务

创建一个实现IJob接口的任务类:

public class MyJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        await Console.Out.WriteLineAsync("Hello, Quartz!");
    }
}

在.NET Core应用程序的Startup.cs文件中,配置Quartz:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddSingleton<IJobFactory, QuartzJobFactory>();
    services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();

    services.AddSingleton<AutowiringJob>();
    services.AddSingleton(new JobSchedule(
        jobType: typeof(AutowiringJob),
        cronExpression: "0/5 * * * * ?")); // 每5秒执行一次

    services.AddHostedService<QuartzHostedService>();

    // ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{
    // ...

    var scheduler = serviceProvider.GetService<IScheduler>();
    scheduler.Start().GetAwaiter().GetResult();

    // ...
}

步骤三:运行定时任务

创建一个QuartzHostedService类,用于启动定时任务:

public class QuartzHostedService : IHostedService
{
    private readonly IScheduler _scheduler;

    public QuartzHostedService(IScheduler scheduler)
    {
        _scheduler = scheduler;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _scheduler.Start().WaitOne();
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _scheduler.Shutdown().WaitOne();
        return Task.CompletedTask;
    }
}

Quartz会在后台执行定时任务,并提供Web页面来监视和管理任务。

结语

无论是Hangfire还是Quartz,它们都是.NET Core中实现定时任务的强大工具。它们提供了丰富的功能和灵活的配置选项,使我们能够轻松地定义和执行各种定时任务。根据实际情况和需求,选择适合自己的工具,可以轻松实现定时任务的管理和调度。


全部评论: 0

    我有话说: