写点什么

如何使用 Asp.net Core 实现定时任务,轻松解决任务调度问题!

作者:高端章鱼哥
  • 2023-08-17
    福建
  • 本文字数:3165 字

    阅读完需:约 10 分钟

如何使用Asp.net Core实现定时任务,轻松解决任务调度问题!

一、前言


Asp.net core 作为一种高效、跨平台的 web 框架,在开发过程中,我们常常需要在后台执行定时任务,例如清理无用文件、生成报告、发送邮件等任务。对于这种需求,我们可以使用第三方库(如 Hangfire 或 Quartz.NET)来实现任务调度和执行,也可以使用 asp.net core 自带的 Hosting 模块和 System.Timers.Timer 类来实现简单的定时任务。


本篇文章主要介绍如何使用 Asp.net core 自带的 Hosting 模块和 System.Timers.Timer 类,以及 Hangfire 和 Quartz.NET 分别实现定时任务。将展示一个完整的示例代码,并详细解释代码中各个部分的含义和作用,以帮助理解实现过程和相关知识点。

二、自带的 Hosting 模块实现任务调度


下面将分步骤详细介绍如何使用 asp.net core 自带的 Hosting 模块和 System.Timers.Timer 类来实现定时任务。


  • 创建一个控制台应用程序

首先,在 Visual Studio 中创建一个控制台应用程序。


  • 添加必要的 NuGet 包

在项目中添加以下 NuGet 包:


  • Microsoft.Extensions.Hosting.Abstractions

  • Microsoft.Extensions.Hosting

这两个 NuGet 包提供了 asp.net core 的 Hosting 模块和应用程序生命周期管理功能。


  • 创建一个 HostBuilder 对象

在 Main 方法中创建一个 HostBuilder 对象:


static void Main(string[] args){    var builder = new HostBuilder()            .UseConsoleLifetime()   // 控制台生命周期管理            .ConfigureServices((hostContext, services) =>            {                 // 配置服务            });                       builder.Build().Run();}
复制代码


HostBuilder 提供了配置应用程序服务、托管生命周期、配置应用程序配置等功能。可以使用 UseConsoleLifetime 方法来配置应用程序的控制台生命周期管理。


  • 添加定时任务

在 ConfigureServices 方法中添加定时任务:


ConfigureServices((hostContext, services) =>{    // 添加定时器组件    services.AddHostedService<MyTimer>();});
复制代码


上面的代码中,我们向服务容器中添加了一个 MyTimer 类,这个类实现了 IHostedService 接口。


  • 实现 IHostedService 接口

在 MyTimer 类中实现 IHostedService 接口:


// MyTimer.cspublic class MyTimer : IHostedService, IDisposable{    private readonly Timer _timer;    public MyTimer()    {        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); // 每5秒执行一次DoWork方法    }    public Task StartAsync(CancellationToken cancellationToken)    {        Console.WriteLine("定时任务已启动");        return Task.CompletedTask;    }    public Task StopAsync(CancellationToken cancellationToken)    {        Console.WriteLine("定时任务已停止");        return Task.CompletedTask;    }    public void Dispose()    {        _timer?.Dispose();    }    private void DoWork(object state)    {        Console.WriteLine($"定时任务执行中,当前时间:{DateTime.Now}");    }}
复制代码


MyTimer 类继承了 IHostedService 接口,该接口定义了应用程序生命周期管理的方法。在 MyTimer 的构造函数中,我们创建了一个计时器,并在每 5 秒钟的时间间隔内执行 DoWork 方法。在 StartAsync 方法中,输出“定时任务已启动”信息;在 StopAsync 方法中,输出“定时任务已停止”信息。Dispose 方法用于释放计时器资源。


  • 运行应用程序

完成上面的步骤后,我们可以运行应用程序,观察控制台输出的结果。


每 5 秒钟控制台会输出一条类似于“定时任务执行中,当前时间:2023/06/12 15:34:48”的信息,表示定时任务正在运行。当我们手动停止应用程序时,控制台会输出“定时任务已停止”信息,表示定时任务已经被成功停止。


至此,我们成功地使用 asp.net core 自带的 Hosting 模块和 System.Timers.Timer 类实现了定时任务。在实际应用中,可以根据需求添加更多的定时任务,并调整计时器的时间间隔等参数。

三、Hangfire 实现任务调度




下面将详细介绍如何使用 asp.net core 引入 Hangfire 来实现任务调度和执行。


  • 创建一个 asp.net core Web 应用程序

首先,在 Visual Studio 中创建一个 asp.net core Web 项目。


  • 添加必要的 NuGet 包

在项目中添加以下 NuGet 包:


  • Hangfire.AspNetCore

  • Hangfire.SqlServer

这两个 NuGet 包提供了 Hangfire 框架所需的组件和功能。


  • 配置 Hangfire

在 Startup.cs 文件中配置 Hangfire:


public void ConfigureServices(IServiceCollection services){    // 配置Hangfire    GlobalConfiguration.Configuration.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection"));    services.AddHangfire(config => config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));    services.AddHangfireServer();}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){ // 启用Hangfire仪表板 app.UseHangfireDashboard();
// ...}
复制代码


上述代码中,我们在 ConfigureServices 方法中配置了 Hangfire,并使用 AddHangfireServer 方法启用了 Hangfire 服务。同时,我们也针对数据库进行了配置。


在 Configure 方法中,我们除了启用了 Hangfire 仪表板之外,还需要在中间件管道中注册 Hangfire 服务:


  • 添加定时任务

在 Actions 文件夹内创建 ScheduledTasks 类,并添加定时任务:


public class ScheduledTasks{    public void DoSomething()    {        Console.WriteLine("Hangfire: Doing something...");    }
public void DoSomethingElse() { Console.WriteLine("Hangfire: Doing something else..."); }}
复制代码


在上面的代码中,我们创建了两个定时任务:DoSomething 和 DoSomethingElse。


  • 注册定时任务

在 ConfigureServices 方法中注册定时任务:


复制 services.AddTransient<ScheduledTasks>();


services.AddTransient<ScheduledTasks>();
// 注册定时任务RecurringJob.AddOrUpdate<ScheduledTasks>(x => x.DoSomething(), Cron.Minutely);RecurringJob.AddOrUpdate<ScheduledTasks>(x => x.DoSomethingElse(), Cron.Hourly);
复制代码


在上面的代码中,我们使用 AddOrUpdate 方法来注册定时任务。第一个参数为委托表达式,指定了要执行的任务;第二个参数为 Cron 表达式,指定了任务的执行时间。


在上面的代码中,我们每分钟执行 DoSomething 任务,每小时执行 DoSomethingElse 任务。


  • 运行应用程序

完成上面的步骤后,我们可以运行应用程序在 Hangfire 仪表板中查看定时任务的执行情况。


在仪表板的"Recurring jobs"选项卡中,我们可以看到我们刚刚注册的两个定时任务以及它们的下一次执行时间。在任务执行时,我们可以在控制台输出中看到“Hangfire: Doing something…”或“Hangfire: Doing something else…”等信息,表示任务已经被成功执行。


至此,我们成功地使用 asp.net core 引入 Hangfire 来实现任务调度和执行,并注册了两个定时任务进行演示。在实际应用中,我们可以根据需求添加更多的定时任务,并根据具体业务场景进行调整和优化。


四、.net Core 软件分享


Jnpf 低代码是一个快速开发应用的平台,两大技术引擎 Java/.Net 开发,旨在提供可视化的界面设计和逻辑编排,大幅降低开发门槛。它预置大量开箱即用的功能,可以满足按需定制灵活拼装。稳定强大的集成能力,一次设计,完成多端适配。Jnpf 提供了一个用户友好的开放接口,可以轻松地与各种构建工具和 IDE 集成。还支持插件和自定义规则,使得开发人员可以根据项目的特定需求和标准对其进行定制化配置。更多详细信息可以查看 jnpf 官方文档。


尝试自己搭建一个应用:https://www.jnpfsoft.com/?infoq


通过它,编码薄弱的 IT 人士也能自己搭建个性化的管理应用,降低技术门槛。开发者仅需少量代码或无需代码就可以开发出各类应用管理系统,由于多数采用组件和封装的接口进行开发,使得开发效率大幅提升。

发布于: 59 分钟前阅读数: 5
用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
如何使用Asp.net Core实现定时任务,轻松解决任务调度问题!_Web_高端章鱼哥_InfoQ写作社区