1、隊列任務
隊列任務只執行在沒有異常的情況下僅處理一次,若發生異常,提供重試機制,異常及重試信息都會被記錄到數據庫中,通過Hangfire控制面板可以查看到這些信息。
可以通過 BackgroundJob.Enqueue() 方法來加載執行隊列任務:
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
2、延遲任務
延遲任務和隊列任務類似,就是在一定時間之后執行任務:
BackgroundJob.Schedule(() => Console.WriteLine("Hello, world"),TimeSpan.FromDays(1));
hangfire會在固定時間間隔中檢查調度,將任務調度到隊列中,這個時間間隔可以自己設置:
var options = new BackgroundJobServerOptions { SchedulePollingInterval = TimeSpan.FromMinutes(1) }; app.UseHangfireServer(options);
其他的如超時等設置也可以用 BackgroundJobServerOptions 來設置。
3、循環任務
循環任務使用 RecurringJob.AddOrUpdate() 方法添加,如果存在即更新方法。通過 Cron 來設置定時執行時間。也可以指定時區:
RecurringJob.AddOrUpdate("powerfuljob", () => Console.Write("Powerful!"), "0 12 * */2", TimeZoneInfo.Local);
第一個參數為每個任務的唯一標識符區分大小寫,可以用 RemoveIfExists 方法來刪除重復操作,沒有重復操作不會報錯。
RecurringJob.RemoveIfExists("some-id");
通過 Trigger 方法可以立即執行循環任務,觸發調用的信息不會被記錄在循環任務本身中,它的下一次執行時間也不會從這次運行中重新計算。例如,如果您有一個在星期三運行的每周作業,並且您在星期五手動觸發它,它將在下一個星期三運行。
RecurringJob.Trigger("some-id");
4、延續任務
延續任務就是在一個任務執行后,緊接着繼續執行任務,通過 BackgroundJob.ContinueJobWith() 方法添加。
BackgroundJob.ContinueJobWith("powerfuljob", () => Console.WriteLine("Continuation!"));
第一個參數是父任務的唯一標識符,在此標識符的任務執行完成后,即執行我們后續的任務。
5、批處理
批處理要收費,就算啦,哈哈
6.傳遞參數與依賴
不管是隊列任務、延遲任務都有重載方法使用泛化來調用類中的方法,如下:
BackgroundJob.Enqueue<EmailSender>(x => x.Send(13, "Hello!"));
參數傳遞用值類型,不能用out和ref。
7、取消令牌
在方法的執行中可以傳入 CancellationToken 大大降低了應用程序關閉時間和出現 ThreadAbortException。如下
BackgroundJob.Enqueue<IService>(x => x.LongRunningMethod(CancellationToken.None));
public async Task LongRunningMethod(CancellationToken token) { for (var i = 0; i < Int32.MaxValue; i++) { await Task.Delay(TimeSpan.FromSeconds(1), token); } }
專用后台進程監視所有具有取消令牌參數的方法的后台作業任務,並輪詢存儲以查看它們的當前狀態。當檢測到狀態改變或請求關閉時,相應的取消令牌的任務被取消。