1. 程式人生 > >Core開發-後臺任務利器Hangfire使用

Core開發-後臺任務利器Hangfire使用

ASP.NET Core開發系列之後臺任務利器Hangfire 使用。

Hangfire 是一款強大的.NET開源後臺任務利器,無需Windows服務/任務計劃程式。

可以使用於ASP.NET 應用也可以使用於控制檯。Hangfire 只需簡單幾句程式碼即可建立新的不同種類的任務。

目前 Hangfire 已經支援.NET Core ,現在就給大家講解下在ASP.NET Core 裡的使用。

Hangfire GitHub:https://github.com/HangfireIO/Hangfire

官網:http://hangfire.io/ 

相關文件介紹:http://docs.hangfire.io/en/latest/

 

首先我們新建一個ASP.NET Core Web Application

選擇模板-》空的模板

然後新增引用:

NuGet 命令列執行

Install-Package Hangfire

 

新增好引用以後我們就可以來使用。

開啟Startup.cs

首先在ConfigureServices 方法中註冊服務:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHangfire(r=>r.UseSqlServerStorage("Data Source=.;Initial Catalog=HangfireDemo;User ID=sa;Password=123456"));
        }

這裡是配置資料庫,資料庫需要確保存在,這裡配置的是SQL Server資料庫,目前官方支援SQL Server。

然後在Configure 方法中加入HangfireServer及HangfireDashboard:

 

 

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHangfireServer();
            app.UseHangfireDashboard();

            app.Run(context =>
            {
                return context.Response.WriteAsync("Hello from ASP.NET Core!");
            });
        }

 

 

 

然後選擇Kestrel執行,訪問地址:http://localhost:5000/hangfire

成功執行,下面我們就可以來新增任務了。

 

app.Map("/index", r => { r.Run(context => { //任務每分鐘執行一次 RecurringJob.AddOrUpdate(() => Console.WriteLine($"ASP.NET Core LineZero"), Cron.Minutely()); return context.Response.WriteAsync("ok"); }); }); app.Map("/one", r => { r.Run(context => { //任務執行一次 BackgroundJob.Enqueue(() => Console.WriteLine($"ASP.NET Core One Start LineZero{DateTime.Now}")); return context.Response.WriteAsync("ok"); }); }); app.Map("/await", r => { r.Run(context => { //任務延時兩分鐘執行 BackgroundJob.Schedule(() => Console.WriteLine($"ASP.NET Core await LineZero{DateTime.Now}"), TimeSpan.FromMinutes(2)); return context.Response.WriteAsync("ok"); }); });

 

 

這裡建立任務只是為了方便,我們也可以在初始化的時候建立,也可以在controller 中建立。 

下面我們來執行。

首先訪問 http://localhost:5000/index

然後訪問 http://localhost:5000/await

最後訪問 http://localhost:5000/one

這樣任務也就都執行起來了。

完整程式碼:

public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHangfire(r=>r.UseSqlServerStorage("Data Source=.;Initial Catalog=HangfireDemo;User ID=sa;Password=123456"));
        }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            //GlobalConfiguration.Configuration.UseSqlServerStorage("Data Source=.;Initial Catalog=OrchardCMS;User ID=sa;Password=sa123456");
            app.UseHangfireServer();
            app.UseHangfireDashboard();
            app.Map("/index", r =>
            {
                r.Run(context =>
                {
                    //任務每分鐘執行一次
                    RecurringJob.AddOrUpdate(() => Console.WriteLine($"ASP.NET Core LineZero"), Cron.Minutely());
                    return context.Response.WriteAsync("ok");
                });
            });
            app.Map("/one", r =>
            {
                r.Run(context =>
                {
                    //任務執行一次
                    BackgroundJob.Enqueue(() => Console.WriteLine($"ASP.NET Core One Start LineZero{DateTime.Now}"));
                    return context.Response.WriteAsync("ok");
                });
            });
            app.Map("/await", r =>
            {
                r.Run(context =>
                {
                    //任務延時兩分鐘執行
                    BackgroundJob.Schedule(() => Console.WriteLine($"ASP.NET Core await LineZero{DateTime.Now}"), TimeSpan.FromMinutes(2));
                    return context.Response.WriteAsync("ok");
                });
            });

            app.Run(context =>
            {
                return context.Response.WriteAsync("Hello from ASP.NET Core!");
            });
        }
    }

通過Hangfire, 這樣我們就可以很方便的在ASP.NET Core 裡建立後臺任務。而且提供管理介面供我們操作。