Hangfire可用作任务调度,类似延迟任务、队列任务、批量任务和定时任务等。

一、nuget Hangfire包

找到Hangfire.AspNetCore和Hangfire.SqlServer包,可以在nuget面板中找到或直接像如下方式安装:

Install Package Hangfire.AspNetCore

Install Package Hangfire.SqlServer

二、在Startup.cs文件中加入以下代码:

写一个Hangfire的扩展类,如下所示:

   public static class HangFireModule
{
public static IApplicationBuilder UseHangfire(this IApplicationBuilder app)
{
app.UseHangfireServer();
app.UseHangfireDashboard(); return app;
} public static IServiceCollection AddHangfire(this IServiceCollection services)
{
services.AddHangfire(x => x.UseSqlServerStorage(ConfigurationSetting.Configuration["ConnectionString:MyDb_Hangfire"]));
return services;
}
}

在Startup的ConfigureServices方法中,加入services.AddHangfire();

在Startup的Configure方法中,加入app.UseHangfire();

三、自动加入任务

1.在当前模块中,新创建一个名为IHangfireTask的接口,将其注册为瞬时生命周期服务。我们将要实现的是,从此以后,继承该接口的类型都会被自动加入到任务调度中。

    /// <summary>
/// Hangfire任务接口,任何继承该接口的都会加入到Hangfire任务
/// </summary>
public interface IHangfireTask : ITransient {
/// <summary>
/// 运行hangfire任务
/// </summary>
void Run();
}

ITransient接口的作用就是,将所有继承ITransient的接口和类型注册为瞬时生命周期的服务。

2.在HangFireModule中新增一个UseHangfireTask扩展方法,目的是在Startup的Configure方法中使用,在程序启动的时候就执行该方法。

        //运行Hangfire任务
public static void UseHangfireTask(this IApplicationBuilder app) {
//找到继承了IHangfireTask接口的实例
IList<IHangfireTask> list = ServiceLocator.Services.GetServices<IHangfireTask>()?.ToList();
if (list?.Count > ) {
foreach (var item in list) {
item.Run();
}
}
}

加入到Startup的Configure方法中:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
{
ServiceLocator.SetServices(serviceProvider);
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler();
} app.UseMvc(); app.UseSwagger();
app.UseSwaggerUi(); app.UseHangfire();
app.UseHangfireTask(); }

如此这样,我们就做到了在程序刚启动时,程序就会自动去找到继承自IHangfireTask接口的所有类型并运行它们的Run()方法。

我们可以在Run()方法中实现诸如Hangfire的BackgroundJob或RecurringJob等任务。

接下来我们就用代码来实现一下!

我们现在想实现一个定时任务,则看如下代码:

   public class RecurringTask:IHangfireTask
{
private log4net.ILog log => LogHelper.Log4NetInstance.LogFactory(typeof(RecurringTask)); public void RunTask()
{
log.Info("每分钟执行一次定时任务");
} public void Run()
{
RecurringJob.AddOrUpdate(()=> RunTask(), "* * * * *");
}
}

这里有一个地方需要注意,在使用RecurringJob或BackgroundJob的时候,就例如()=> RunTask()这个,RunTask方法的访问修饰符必须是public。如果有必要,尽量在RunTask方法内被调用的其他方法的访问修饰符也定义为public。

在Hangfire中,Cron表达式包含五个字段:分钟、小时、日期、月份、周,因此定时任务最低也只能是一分钟,没有秒数可供选择。

接下来我们看看程序运行的结果:

四、Hangfire的基本任务

1. BackgroundJob.Enqueue

作用:将一个任务放入到某个持久化的队列中并挨个执行,以便程序可以继续执行其他代码。该任务只执行一次。

实现:BackgroundJob.Enqueue(() => RunTask());

2. BackgroundJob.Schedule

作用:将一个任务延迟到某个时间点后执行。

实现:BackgroundJob.Schedule(() => RunTask(), TimeSpan.FromSeconds(30));

即在30秒后才执行RunTask()方法。

3. RecurringJob.AddOrUpdate

作用:重复执行一个任务,一般用作定时任务处理。

实现:RecurringJob.AddOrUpdate(()=> RunTask(), "* * * * *");

即每分钟都执行一次RunTask()方法。

4. BackgroundJob.ContinueWith

作用:类似工作流的形式,将多个任务连接起来按照顺序执行。

实现:

string jobId = BackgroundJob.Schedule(() => Console.WriteLine("第一个任务"),TimeSpan.FromSeconds(10));
BackgroundJob.ContinueWith(jobId, () => RunTask());

注意:以上RunTask()方法的访问修饰符必须是public。

.net core 之Hangfire任务调度的更多相关文章

  1. Hangfire任务调度框架使用

    1.HangFire简介 HangFire是一个免费简单实用的分布式后台定时调度服务,在现在.net开发中,人气算是很高的. HangFire提供了内置集成化的控制台,可以直观明了的查看作业调度情况, ...

  2. ASP.NET Core 使用 Hangfire 定时任务

    定时任务组件,除了 Hangfire 外,还有一个 Quarz.NET,不过 Hangfire .NET Core 支持的会更好些. ASP.NET Core 使用 Hangfire 很简单,首先,N ...

  3. Asp.Net Core 集成 Hangfire 配置使用 Redis 存储

    Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...

  4. Spark Core 资源调度与任务调度(standalone client 流程描述)

    Spark Core 资源调度与任务调度(standalone client 流程描述) Spark集群启动:      集群启动后,Worker会向Master汇报资源情况(实际上将Worker的资 ...

  5. .NET Core下开源任务调度框架Hangfire

    今天无意中发现了一个很好用的任务调度框架.Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在 .net core的环境中,由Core自带的DI管理着生命周期. 相较于qu ...

  6. .NET Core下开源任务调度框架Hangfire的Api任务拓展(支持秒级任务)

    HangFire的拓展和使用 看了很多博客,小白第一次写博客. 最近由于之前的任务调度框架总出现问题,因此想寻找一个替代品,之前使用的是Quartz.Net,这个框架方便之处就是支持cron表达式适合 ...

  7. Hangfire 任务调度

    Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows Ser ...

  8. asp.net core 中hangfire面板的配置及使用

    1.定义校验授权类DyDashboardAuthorizationFilter /// <summary> /// Hangfire仪表盘配置授权 /// </summary> ...

  9. C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?

    原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ...

随机推荐

  1. Mybatis中resultType理解

  2. LeetCode--290--单词模式

    问题描述: 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之 ...

  3. 内核开启VF小结

    2017-8-29 16:33:40 内核开启VF小结: 1. eth2上创建4个VFecho 4 > /sys/class/net/eth2/device/sriov_numvfs2. 关闭e ...

  4. centOS 6.5安装python和nginx

    一.安装python3.5 1.安装python3.5

  5. 一个不该写的bat

    新建bat文件,放到D盘根目录 %0|%0 进入到C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Program ...

  6. scrapy-redis(一)

    安装scrapy-redis pip install scrapy-redis 从GitHub 上拷贝源码: clone github scrapy-redis源码文件 git clone https ...

  7. 日期在Linux与Windows下的区别

    最近遇到了这个问题,就是相同的代码在Windows与Linux下的日期转换不一致. 原因:时区问题,主要是操作系统与JVM中的时区不同导致的 在网上查了很多处理的方法:最后总结出一条简单粗暴的方法:原 ...

  8. SpringBoot项目Shiro的实现(一)

    一.Shiro的简单介绍 Shiro是Apache下的一个开源项目,我们称之谓Apache Shiro,它是一个易用与Java项目的安全框架,提供了认证.授权.加密.会话管理,与Spring Secu ...

  9. oracle登陆触发器及精细审计

    --oracle精细审计FGAselect tab2.userhost 引起操作的主机名,tab2.os_user 引起操作的主机用户,tab2.object_schema 被操作对象所属用户,tab ...

  10. URL和URI的不同

    URL是什么?有什么用? URL(统一资源定位符)是Internet上资源的地址,可以定义为引用地址的字符串,用于指示资源的位置以及用于访问它的协议. URL是在网络上定位资源的最普遍使用的方式,它提 ...