前言
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.cs
public 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服务:
app.UseHangfireServer();
- 添加定时任务
在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>();
// 注册定时任务
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来实现任务调度和执行,并注册了两个定时任务进行演示。在实际应用中,我们可以根据需求添加更多的定时任务,并根据具体业务场景进行调整和优化。