NuGet 上有幾個可用的Hangfire 的軟件包。若是在ASP.NET應用程序中安裝HangFire,並使用Sql Server做爲存儲器,那麼請在Package Manager Console窗口中鍵入如下命令:html
PM> Install-Package Hangfire
配置
在安裝package後,添加或者更新如下幾行到Owin Startp類:git
using Hangfire; // ... public void Configuration(IAppBuilder app) { GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>"); app.UseHangfireDashboard(); app.UseHangfireServer(); }
須要配置受權
默認狀況下,只有本地有權限訪問Hangfire儀表板。若是須要受權遠程訪問,那麼儀表板的受權必須進行相應的配置。github
而後打開Hangfire儀表板來測試您的配置。編譯項目並在瀏覽器中打開如下URL:express
1
|
http:
//<your-site>/hangfire
|
用法
添加工做
HangFire處理不一樣類型的後臺任務,而且使用一個獨立的上下文環境調用他們。瀏覽器
Fire-And-forget(發佈/訂閱)
這是一個主要的後臺任務類型,持久化消息隊列會去處理這個任務。當你建立了一個發佈/訂閱任務,該任務會被保存到默認隊列裏面(默認隊列是"Default",可是支持使用多隊列)。多個專一的工做者(Worker)會監聽這個隊列,而且從中獲取任務而且完成任務。服務器
BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
延遲
若是想要延遲某些任務的執行,能夠是用如下任務。在給定延遲時間後,任務會被排入隊列,而且和發佈/訂閱任務同樣執行。app
BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
循環
按照週期性(小時,天等)來調用方法,請使用RecurringJob
類。在複雜的場景,您可使用CRON表達式指定計劃時間來處理任務。post
RecurringJob.AddOrUpdate(() => Console.WriteLine("Daily Job"), Cron.Daily);
連續
連續性容許您經過將多個後臺任務連接在一塊兒來定義複雜的工做流。測試
var id = BackgroundJob.Enqueue(() => Console.WriteLine("Hello, ")); BackgroundJob.ContinueWith(id, () => Console.WriteLine("world!"));
釋放
Hangfire將您的任務保存到持久化庫彙總,而且以可靠的方式處理它們。這意味着,你能夠中斷Hangfire Worder的線程,從新加載應用程序域,或者終止程序,即便這樣您的任務仍會被處理。只有在你代碼的最後一行執行完成,Hangfire纔會標記這個任務完成。而且知道任務可能在最後一行代碼執行以前失敗。它包含多種 自動-重試機制,它能夠自動處理在存儲或代碼執行過程當中發生的錯誤。優化
這對於通用託管環境(如IIS Server)很是重要。它們能夠包含不一樣的優化,超時和錯誤處理代碼(可能致使進程終止)來防止很差的事情發生。若是您沒有使用可靠的處理和自動機制,您的工做可能會丟失。您的最終用戶可能無限期等待某些任務,如電子郵件,報告,通知等。
可是當您的存儲空間破損時,Hangfire沒法作任何事情。請爲您的存儲使用不一樣的故障切換策略,以保證在發生災難時處理每一個做業。
以上文章來源:https://www.cnblogs.com/tangxing/p/6669051.html
原文地址:http://docs.hangfire.io/en/latest/quick-start.html
拓展內容
時區配置問題:
RecurringJob.AddOrUpdate(() => WriteLog("xcxxx"), Cron.Daily(14,00), TimeZoneInfo.Local); //注意最小單位是分鐘,
//TimeZoneInfo.Local 使用服務器本地時間
權限配置問題:
OwinStartup 下 Configuration文件
GlobalConfiguration.Configuration.UseSqlServerStorage("HangfireDBConnection"); app.UseHangfireServer();
//app.UseHangfireDashboard(); //無權限控制 var options = new DashboardOptions { Authorization = new[] { new HangfireAuthorizationFilter() } }; app.UseHangfireDashboard("/hangfire", options); //採用權限控制
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter { //這裏須要配置權限規則 public bool Authorize(DashboardContext context) { return new UserService().IsAdmin(); //True 能夠訪問,False拒絕訪問,結合系統原有邏輯設置 } }