前言:就是定时去执行某一个功能需求,最常见的就是定时去备份数据库,或者去更新token
网上搜索定时执行会有很多方案,最多的就是通过Timer去实现,然后还有通过兄台那个服务去实现,然后又继续搜了下相关内容,发现个好用的,能完美匹配我的需求的,就是hangfire去实现。
一、Timer实现
public void s()
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 60000;//执行间隔时间,单位为毫秒
timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer1_Elapsed);
timer.AutoReset = true; //一分钟一次,保证每一分钟都执行一次。
}
private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//do your work
}
没什么可说的,需要设置时间间隔,然后每一个时间间隔触发事件去执行业务,代码不简洁,而且如果需求是每月一号去执行的话,这个就完犊子了,不好用,
二、windows服务
c#之添加window服务(定时任务) - 云+社区 - 腾讯云
上面这个是可以的,但是需要应用提供操作接口,去操作比如备份数据库等功能需求。
三、Hangfire
3.1 简介
Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序,可以使用于ASP.NET 应用也可以使用于控制台。Hangfire 只需简单几句代码即可创建新的不同种类的任务。目前 Hangfire 已经支持.NET Core 。
GitHub:https://github.com/HangfireIO/Hangfire
官网:http://hangfire.io/
相关文档介绍:http://docs.hangfire.io/en/latest/
3.2 创建AspNetCore项目
此处笔者创建一个 Asp.NET Core Web API项目
3.3 安装
引入nuget包 Hangfire.AspNetCore
版本很多,我先安装这个
3.4 配置
需要修改Startup类中的这两处
如果需要对数据库操作,需要添加对应的版本,笔者这里不需要对数据库操作,因此不用添加数据库版本,但是需要操作内存,因此在添加个Hangfire.MemoryStorage程序包
3.5 写配置
ConfigureServices
配置代码:
public void ConfigureServices(IServiceCollection services)
{
//使用内存做持久化,有数据库的可以添加数据库程序包,然后修改这里配置就可以了
services.AddHangfire(x => x.UseStorage(new MemoryStorage()));
}
Configure
添加配置代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//2.0版本后不在Configure中实现,需要在ConfigureServices中添加服务
//这也是为什么这里会报警的原因
app.UseHangfireServer();
//启动hangfire面板
app.UseHangfireDashboard();
RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"), Cron.Minutely());
}
这是网上的代码,有两点问题
1、方法签名即将过时,后续发布的2.0版本将采用新的函数接口,具体的修改可根据提示来修改,很简单,这里不再赘述。
2、正常情况,使用Cron.Minutely()函数是表示每分钟执行一次,但是这里没有执行,需要再添加一个参数,TimeZoneInfo.Local
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseHangfireServer();
app.UseHangfireDashboard();
var strDate=DateTime.Now.ToString();
RecurringJob.AddOrUpdate(() => Recurring(), Cron.Minutely(), TimeZoneInfo.Local);
}
//说明,此处必须得是public的,不然,RecurringJob.AddOrUpdate不能调用这个函数,会报错
public void Recurring()
{
var strDate=DateTime.Now.ToString();
Console.WriteLine("{0},{1}","每分钟调一次",strDate);
}
可以看到是定时执行的。
3.6 Cron
很灵活,想实现什么定时需求调用那个函数签名就可以,包括2.0版本后需要自己写表达式,具体的可以参考这篇文章【转】cron表达式详解 - 我只吃大碗 - 博客园
3.7 面板
地址:https://localhost:5001/hangfire
这里要根据自己的地址来,默认是hangfire,访问Hangfire的dashboard页面,看一下任务的执行情况。