ASP.NET Core使用Hangfire做定时任务
时间:2021-07-21
本文章向大家介绍 ASP.NET Core使用Hangfire做定时任务,主要包括 ASP.NET Core使用Hangfire做定时任务使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、新建 ASP.NET Core项目,使用管理NuGet程序包添加Hangfire,然后ASP.NET Core Startup 类中添加如下代码
using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Hangfire; namespace MyWebApplication { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddHangfire(x => x.UseSqlServerStorage("<connection string>")); services.AddHangfireServer(); } public void Configure(IApplicationBuilder app) { app.UseHangfireDashboard(); } } }
运行以后可以在浏览器中输入http://localhost:5000/hangfire,即运行的地址栏后面加/hangfire,既可以看到效果,如下
全部代码如下:
startup.cs
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Hangfire; namespace ASP.NETCORETest { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); //应用程序的入口点和生命周期---应用程序启动起处理的的任务 services.AddHostedService<FirstStartService>(); services.AddHostedService<SecondStartService>(); //Hangfire定时任务 services.AddHangfire(a => a.UseSqlServerStorage("Data Source=localhost;Initial Catalog=TestHangfire;Integrated Security=True;")); services.AddHangfireServer(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime) { //应用程序的入口点和生命周期---IHostApplicationLifetime 除了程序进入点外,Host的启动和停止,ASP.NET Core不像ASP.NET MVC用继承的方式捕捉启动及停止事件, //而是透过Startup.Configure注入IHostApplicationLifetime来补捉Application启动停止事件 lifetime.ApplicationStarted.Register(async () => await Task.Run(() => Console.WriteLine("IHostApplicationLifetime......Started"))); lifetime.ApplicationStopping.Register(async () => await Task.Run(() => Console.WriteLine("IHostApplicationLifetime......Stopping"))); lifetime.ApplicationStopped.Register(async () => await Task.Run(() => Console.WriteLine("IHostApplicationLifetime......Stopped"))); //停止应用程序 var tt = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(a => { System.Threading.Thread.Sleep(TimeSpan.FromSeconds(100)); Console.WriteLine("IHostApplicationLifetime......Stopp---------ing"); lifetime.StopApplication(); })); tt.Start(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); //Hangfire定时任务 app.UseHangfireDashboard(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } } }
firststartservice.cs
using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace ASP.NETCORETest { public class FirstStartService : IHostedService { public async Task StartAsync(CancellationToken cancellationToken) { await Task.Run(() => { Console.WriteLine("FirstStartService......StartAsync"); }, cancellationToken); //hangfire定时任务 var id = Hangfire.BackgroundJob.Enqueue(() => Console.WriteLine("插入队列的任务")); Hangfire.BackgroundJob.Schedule(() => Console.WriteLine("延迟的任务"), TimeSpan.FromSeconds(5)); Hangfire.RecurringJob.AddOrUpdate(() => Console.WriteLine("循环执行的任务"), Hangfire.Cron.Minutely); Hangfire.BackgroundJob.ContinueWith(id, () => Console.WriteLine("指定任务执行之后执行的任务")); } public async Task StopAsync(CancellationToken cancellationToken) { await Task.Run(() => { Console.WriteLine("FirstStartService......StopAsync"); }, cancellationToken); } } }
secondstartservice.cs
using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace ASP.NETCORETest { public class SecondStartService : IHostedService { public async Task StartAsync(CancellationToken cancellationToken) { await Task.Run(() => { Console.WriteLine("SecondStartService......"); }, cancellationToken); } public async Task StopAsync(CancellationToken cancellationToken) { await Task.Run(() => { Console.WriteLine("SecondStartService......StopAsync"); }, cancellationToken); } } }
2、在OWIN Startup 使用如下,可以参考https://www.cnblogs.com/1175429393wljblog/p/13407506.html
using Hangfire; using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(MyWebApplication.Startup))] namespace MyWebApplication { public class Startup { public void Configuration(IAppBuilder app) { GlobalConfiguration.Configuration .UseSqlServerStorage("<name or connection string>"); app.UseHangfireDashboard(); app.UseHangfireServer(); } } }
龙腾一族至尊龙骑
原文地址:https://www.cnblogs.com/1175429393wljblog/p/15040408.html
- 高效开发 MVVM 和 databinding 你需要使用的工具
- ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预
- 设计模式专题(三)——装饰模式
- ASP.NET AJAX(8)__Microsoft AJAX Library中异步通信层的使用什么是异步通信层Micorsoft AJAX Library异步通信层的组成WebRequestExec
- ASP.NET AJAX(7)_Microsoft AJAX Library扩展客户端组件继承时需要注意的问题扩展类型如何修改已有类型
- ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方
- 设计模式专题(四)——代理模式
- Array数组函数(一)
- ASP.NET AJAX(5)__JavaScript原生类型以及Microsoft AJAX Library什么是Microsoft AJAX LibraryObject原生类型Object.pro
- 使用 Octave 来学习 Machine Learning(一)
- ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的
- 讲真,你该做备份的有效性校验了
- memcache安装方法
- 设计模式专题(五)——工厂方法模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PAT (Advanced Level) Practice 1049 Counting Ones (30分)
- 用递归的思想实现二叉树前、中、后序迭代遍历
- 利用WAF进行拒绝服务攻击
- leetcode树之从根到叶的二进制数之和
- Vue3 模板编译原理
- leetcode树之从上到下打印二叉树
- leetcode树之二叉搜索树的最近公共祖先
- leetcode树之从翻转二叉树
- Linux常见的持久化后门汇总
- 一篇文章带你使用 Python搞定对 Excel 表的读写和处理(xlsx文件的处理)
- 从 rollup 初版源码学习打包原理
- leetcode树之相同的树
- Mysql Sql 语句练习题 (50道)
- 【每日一具16】来了!扫描图片批量漂白修正软件
- 实现一个 webpack loader 和 webpack plugin