- 安裝NuGet包
dotnet add package Hangfire.Core
dotnet add package Hangfire.SqlServer
dotnet add package Hangfire.AspNetCore
- 配置Hangfire
- 打開Startup.cs,在ConfigureServices方法中注冊服務
public void ConfigureServices(IServiceCollection services)
{
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(App.Configuration["ConnectionStrings:HangfireConnection"], new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true
}));
services.AddHangfireServer();
}
- 在Configure方法中配置儀表盤
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new[] { new DashboardAuthorizationFilter() },
DashboardTitle = "Zheng He"
});
- 運行項目導航到/hangfire
- 創建單次執行任務
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
- 該方法不會立即調用目標方法,而是運行以下步驟
- 序列化方法信息及其所有參數
- 根據序列化信息創建新的后台作業
- 將后台作業保存到持久性存儲
- 將后台作業排隊到其隊列
- 執行這些步驟后,該方法將立即返回給調用方。另一個Hangfire組件,稱Hangfire Server,檢查持久存儲中排隊的后台作業,並以可靠的方式執行它們
- 排隊作業由專用的工作線程池處理。每個工作線程調用以下進程
- 獲取下一個作業並將其隱藏起來
- 執行作業及其所有擴展篩選器
- 從隊列中刪除作業
- 因此只有在處理成功后才會刪除作業。即使某個進程在執行期間被終止,Hangfire 也會執行補償邏輯,以保證每個作業的處理
- 創建延遲執行任務
BackgroundJob.Schedule(() => Console.WriteLine("Hello, world"),TimeSpanFromDays(1));
- 創建重復執行任務
RecurringJob.AddOrUpdate("easyjob", () => Console.Write("Easy!"), CronDaily);
- 創建延續執行任務
var jobId = BackgroundJob.Enqueue(() => Console.WriteLin("Fire-and-forget!"));
//當上一個任務執行完成后,執行延續任務
BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!");
- 創建批量執行任務
var batchId = Batch.StartNew(x =>
{
x.Enqueue(() => Console.WriteLine("Job 1"));
x.Enqueue(() => Console.WriteLine("Job 2"));
});
- 創建批量延續執行任務
Batch.ContinueBatchWith(batchId, x =>
{
x.Enqueue(() => Console.WriteLine("Last Job"));
});