Querz:Windows任務(wù)計(jì)劃程序位于ASP.NET環(huán)境之外。它可以用來運(yùn)行任何類型的Windows程序。要添加Windows任務(wù),您需要登錄到服務(wù)器。
Hangfire通常在IIS進(jìn)程中運(yùn)行(盡管它也可以在控制臺(tái)應(yīng)用程序中運(yùn)行)。 Hangfire的主要優(yōu)點(diǎn)是開發(fā)人員無需登錄IIS服務(wù)器即可創(chuàng)建計(jì)劃任務(wù) - 在供應(yīng)商托管的IIS環(huán)境中,服務(wù)器訪問不可用時(shí)尤其有用。
定時(shí)任務(wù)調(diào)度問題,是一個(gè)老生常談的問題。網(wǎng)上有許多定時(shí)任務(wù)調(diào)度的解決方案,對(duì)于我而言很早以前主要是使用Window計(jì)劃和Window服務(wù)來做任務(wù)定時(shí)執(zhí)行,然后就開始使用定時(shí)任務(wù)調(diào)度框架Quartz.Net。但是卻一直沒有上手過Hangfire這個(gè)自帶后臺(tái)任務(wù)調(diào)度面板,可以在后臺(tái)手動(dòng)執(zhí)行任務(wù)的神奇的任務(wù)調(diào)度框架。前段時(shí)間終于開始對(duì)他下手了,通過在網(wǎng)上查閱了一些資料和查看了Hangfire在Github中的demo,終于在我自己的項(xiàng)目中用上了Hangfire。在該篇文章中主要簡單介紹一下什么是Hangfire,Hangfire的基本特征與優(yōu)點(diǎn)和使用PostgreSql作為存儲(chǔ)使用。
一、Hangfire是什么:
Hangfire是一個(gè)開源的.NET任務(wù)調(diào)度框架,提供了內(nèi)置集成化的控制臺(tái),可以直觀明了的查看作業(yè)調(diào)度情況,并且Hangfire不需要依賴于單獨(dú)的應(yīng)用程序執(zhí)行(如:windows服務(wù),window計(jì)劃)。并且支持持久性存儲(chǔ)。
二、Hangfire使用條件:
Hangfire與特定的.NET應(yīng)用程序類型無關(guān)。您可以在ASP.NET Web應(yīng)用程序,非ASP.NET Web應(yīng)用程序,控制臺(tái)應(yīng)用程序或Windows服務(wù)中使用它。以下是要求:
1.NET Framework 4.5
2.永久存儲(chǔ)(Hangfire將后臺(tái)作業(yè)和其他與處理有關(guān)的信息保留在永久性存儲(chǔ)器中,所以需要存儲(chǔ)庫來存儲(chǔ)如:MS SQL Server,Redis,MySQL,PostgreSql等)
3.Newtonsoft.Json庫≥5.0.1
三、Hangfire的基本特征與優(yōu)點(diǎn):
通過官網(wǎng)中的一張圖片便可知道它是一個(gè)多么優(yōu)秀的任務(wù)調(diào)度框架,如下圖所示:
四、Hangfire安裝和使用:
在NuGet上有關(guān)于Hangfire的 一系列軟件包:
詳情地址:?NuGet Gallery | Packages matching Hangfire
1、安裝Hangfire所需NuGet包:
Hangfire、Hangfire.Core、Hangfire.PostgreSql?
如下圖:
?2、注冊(cè)Hangfire
在startup.cs入口文件中添加
public void ConfigureServices(IServiceCollection services)
{
services.AddCustomHangfire(Configuration);
}
?注冊(cè)
public static class CustomExtension
{
/// <summary>
/// 注冊(cè)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
{
//如果設(shè)置為true,則創(chuàng)建數(shù)據(jù)庫表。默認(rèn)是true
PrepareSchemaIfNecessary = Convert.ToBoolean(configuration["Hangfire:PrepareSchemaIfNecessary"]),
QueuePollInterval = TimeSpan.FromSeconds(1)
}));
services.AddHangfireServer();
return services;
}
}
3、定義具體要執(zhí)行的定時(shí)任務(wù)
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, "接口錯(cuò)誤:" + ex.Message);
}
return Task.CompletedTask;
}
/// <summary>
/// 執(zhí)行
/// </summary>
public async Task WisdomReportMonthJobExec()
{
//TOdo 具體業(yè)務(wù)邏輯
}
/// <summary>
/// 停止
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task StopAsync(CancellationToken cancellationToken)
{
await Task.Run(() =>
{
Log.Information("已停止運(yùn)行!");
}, cancellationToken);
}
}
其中定時(shí)周期可以?
每個(gè)小時(shí)的哪一分鐘開始執(zhí)行?Cron.Hourly(10);
每天的具體哪個(gè)時(shí)間點(diǎn)執(zhí)行?Cron.Daily(0, 9);
當(dāng)然還有其他的一些執(zhí)行的周期格式,按照官方文檔的使用方式使用即可。
程序運(yùn)行后會(huì)自動(dòng)生成對(duì)應(yīng)的Hangfire數(shù)據(jù)庫,這里需要注意的是,執(zhí)行周期運(yùn)行后是持久性、周期性的,如果你變更了其中的周期,就需要重新將生成的Hangfire數(shù)據(jù)庫清空,然后重新運(yùn)行,保證定時(shí)任務(wù)能在你新修改的周期內(nèi)運(yùn)行。
如圖,即為自動(dòng)生成的數(shù)據(jù)庫:文章來源:http://www.zghlxwxcb.cn/news/detail-514486.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-514486.html
到了這里,關(guān)于C# 定時(shí)服務(wù)之Hangfire使用、與Quartz的對(duì)比的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!