C# 定时服务:Hangfire使用、和Quartz的对比
Querz:Windows任务计划程序位于ASP.NET环境之外。它可以用来运行任何类型的Windows程序。要添加Windows任务,您需要登录到服务器。
Hangfire通常在IIS进程中运行(尽管它也可以在控制台应用程序中运行)。 Hangfire的主要优点是开发人员无需登录IIS服务器即可创建计划任务 - 在供应商托管的IIS环境中,服务器访问不可用时尤其有用。
定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quartz.Net。但是却一直没有上手过Hangfire这个自带后台任务调度面板,可以在后台手动执行任务的神奇的任务调度框架。前段时间终于开始对他下手了,通过在网上查阅了一些资料和查看了Hangfire在Github中的demo,终于在我自己的项目中用上了Hangfire。在该篇文章中主要简单介绍一下什么是Hangfire,Hangfire的基本特征与优点和使用PostgreSql作为存储使用。
Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)。并且支持持久性存储。
二、Hangfire使用条件:
Hangfire与特定的.NET应用程序类型无关。您可以在ASP.NET Web应用程序,非ASP.NET Web应用程序,控制台应用程序或Windows服务中使用它。以下是要求:
1.NET Framework 4.5
2.永久存储(Hangfire将后台作业和其他与处理有关的信息保留在永久性存储器中,所以需要存储库来存储如:MS SQL Server,Redis,MySQL,PostgreSql等)
3.Newtonsoft.Json库≥5.0.1
三、Hangfire的基本特征与优点:
通过官网中的一张图片便可知道它是一个多么优秀的任务调度框架,如下图所示:
四、Hangfire安装和使用:
在NuGet上有关于Hangfire的 一系列软件包:
详情地址: NuGet Gallery | Packages matching Hangfire
1、安装Hangfire所需NuGet包:
Hangfire、Hangfire.Core、Hangfire.PostgreSql
如下图:
2、注册Hangfire
在startup.cs入口文件中添加
-
public void ConfigureServices(IServiceCollection services)
-
{
-
services.AddCustomHangfire(Configuration);
-
}
注册
-
public static class CustomExtension
-
{
-
-
/// <summary>
-
/// 注册Hangfire
-
/// </summary>
-
/// <param name="services"></param>
-
/// <param name="configuration"></param>
-
/// <returns></returns>
-
public static IServiceCollection AddCustomHangfire(this IServiceCollection services, IConfiguration configuration)
-
{
-
-
#region Job
-
services.AddHostedService<WisdomReportMonthJob>();
-
-
services.AddHostedService<WisdomReportDayJob>();
-
#endregion
-
-
var vDbType = configuration["CurrentDbType"];
-
-
services.AddHangfire(x => x.UsePostgreSqlStorage(configuration[$"DataBase:{vDbType}:JYTDBConnString"], new PostgreSqlStorageOptions
-
{
-
//如果设置为true,则创建数据库表。默认是true
-
PrepareSchemaIfNecessary = Convert.ToBoolean(configuration["Hangfire:PrepareSchemaIfNecessary"]),
-
QueuePollInterval = TimeSpan.FromSeconds(1)
-
}));
-
services.AddHangfireServer();
-
-
return services;
-
}
-
}
3、定义具体要执行的定时任务
-
public class WisdomReportMonthJob : IHostedService
-
{
-
private readonly IConfiguration _Configuration;
-
-
/// <summary>
-
///
-
/// </summary>
-
public WisdomReportMonthJob(IConfiguration configuration)
-
{
-
_Configuration = configuration;
-
}
-
-
/// <summary>
-
/// 开启
-
/// </summary>
-
/// <param name="cancellationToken"></param>
-
/// <returns></returns>
-
public Task StartAsync(CancellationToken cancellationToken)
-
{
-
try
-
{
-
Hangfire.RecurringJob.AddOrUpdate("WisdomRunReportMonthJob", () => WisdomReportMonthJobExec(), Cron.Hourly(10),TimeZoneInfo.Local);
-
}
-
catch (Exception ex)
-
{
-
Log.Error(ex, "接口错误:" ex.Message);
-
}
-
return Task.CompletedTask;
-
}
-
/// <summary>
-
/// 执行
-
/// </summary>
-
public async Task WisdomReportMonthJobExec()
-
{
-
//TOdo 具体业务逻辑
-
}
-
-
/// <summary>
-
/// 停止
-
/// </summary>
-
/// <param name="cancellationToken"></param>
-
/// <returns></returns>
-
public async Task StopAsync(CancellationToken cancellationToken)
-
{
-
await Task.Run(() =>
-
{
-
Log.Information("已停止运行!");
-
}, cancellationToken);
-
}
-
}
其中定时周期可以
每个小时的哪一分钟开始执行 Cron.Hourly(10);
每天的具体哪个时间点执行 Cron.Daily(0, 9);
当然还有其他的一些执行的周期格式,按照官方文档的使用方式使用即可。
程序运行后会自动生成对应的Hangfire数据库,这里需要注意的是,执行周期运行后是持久性、周期性的,如果你变更了其中的周期,就需要重新将生成的Hangfire数据库清空,然后重新运行,保证定时任务能在你新修改的周期内运行。
如图,即为自动生成的数据库:
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbikkf
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01