4、Hangfire在AspNetCore中的使用(一)

前言:就是定时去执行某一个功能需求,最常见的就是定时去备份数据库,或者去更新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页面,看一下任务的执行情况。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值