.net core 之Hangfire任务调度
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任务调度的更多相关文章
- Hangfire任务调度框架使用
1.HangFire简介 HangFire是一个免费简单实用的分布式后台定时调度服务,在现在.net开发中,人气算是很高的. HangFire提供了内置集成化的控制台,可以直观明了的查看作业调度情况, ...
- ASP.NET Core 使用 Hangfire 定时任务
定时任务组件,除了 Hangfire 外,还有一个 Quarz.NET,不过 Hangfire .NET Core 支持的会更好些. ASP.NET Core 使用 Hangfire 很简单,首先,N ...
- Asp.Net Core 集成 Hangfire 配置使用 Redis 存储
Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...
- Spark Core 资源调度与任务调度(standalone client 流程描述)
Spark Core 资源调度与任务调度(standalone client 流程描述) Spark集群启动: 集群启动后,Worker会向Master汇报资源情况(实际上将Worker的资 ...
- .NET Core下开源任务调度框架Hangfire
今天无意中发现了一个很好用的任务调度框架.Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在 .net core的环境中,由Core自带的DI管理着生命周期. 相较于qu ...
- .NET Core下开源任务调度框架Hangfire的Api任务拓展(支持秒级任务)
HangFire的拓展和使用 看了很多博客,小白第一次写博客. 最近由于之前的任务调度框架总出现问题,因此想寻找一个替代品,之前使用的是Quartz.Net,这个框架方便之处就是支持cron表达式适合 ...
- Hangfire 任务调度
Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows Ser ...
- asp.net core 中hangfire面板的配置及使用
1.定义校验授权类DyDashboardAuthorizationFilter /// <summary> /// Hangfire仪表盘配置授权 /// </summary> ...
- C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?
原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ...
随机推荐
- JAVA基础知识总结:十二
一.String类 字符串是一种特殊的对象,一旦被初始化就不能被改变了 字符串常量存储于常量池中 二.StringBuffer类 是一个字符串缓冲区,相当于一个容器 特点 a.可以对字符串进行增加和删 ...
- VNPY思维导图架构
VNPY是使用人数世界第三,国内第一的量化交易框架,封装的接口主要有ctp(期货),wind,xtp(股票)等.内部包含回测.实盘.模拟盘等模块.数据库默认为MongoDB的no-sql数据库,基于p ...
- python中文件的读和写操作
一.打开文件 data = open("yesterday",encoding="utf-8").read() # python默认的打字符编码是unicode ...
- tchart example
Random random = new Random(); // Color SeriesColor; int SeriesIndex=0; tChart1.Series.Clear(); Steem ...
- English trip M1 - AC11 I Dreamed a Dream? 我做了一个梦 Teacher:Lamb
In this lesson you will learn to describe an experience. 这节课你讲学习到描述经历 课上内容(Lesson) 词汇(Key Word ) 句型 ...
- django 中基于类的视图
django 视图 分为两种: 1. FBV 基于函数的视图 function based view 2. CBV 基于类的视图 class based ...
- 【模板/经典题型】树上第k大
直接对树dfs一发,对每个节点建出主席树. 查询的时候主席树上二分,四个参数x+y-lca(x,y)-fa[lca(x,y)]. 如果要求支持动态加边的话,只需要一个启发式合并即可,每次暴力重构主席树 ...
- SQL 2016安装
微软数据库SQL Server 2016正式版在2016年6月就发布,由于近期工作忙,一直拖到现在才有时间把安装过程写到博客上,分享给大家.本人一直习惯使用英文版,所以版本和截图都是英文版的.废话少说 ...
- MySQL补充
1.mysql限制显示条目数:Limit, offset 图片网址:https://sqlbolt.com/lesson/filtering_sorting_query_results 实例: SEL ...
- Sticks HDU - 1455 (未完成)
George took sticks of the same length and cut them randomly until all parts became at most 50 units ...