C# .net6使用Hangfire
首先我们先来了解什么是Hangfire?
Hangfire 是一个用于 .NET 的任务调度库,允许你在后台运行任务,而不需要依赖外部的任务队列服务或复杂的基础设施。它简化了后台任务的创建、调度和管理过程,使得在 .NET 应用程序中处理长期运行的任务变得更加容易和可靠。目前1.6+版本已支持.NET Core、.Net 5+。个人认为它最大特点在于内置提供集成化的控制台,方便后台查看及监控。
主要特性
1.简单易用:Hangfire 提供了简单的 API 来创建、调度和管理后台任务。你只需用简单的代码调用 Hangfire 的方法即可创建和管理任务。
2.持久化存储:Hangfire 支持将任务信息存储到多种数据库中,包括 SQL Server、Redis、MongoDB 等。任务的状态、失败记录和其他信息都可以持久化到这些存储中,以便任务可以在系统重启后恢复。
3.任务调度:Hangfire 支持多种调度策略,包括立即执行、延迟执行、重复执行和定时任务等。你可以使用简单的表达式或代码来指定任务的调度规则。
4.任务监控:Hangfire 提供了一个内置的仪表板,用于监控任务的状态、查看任务执行历史、管理失败的任务等。这使得你可以很方便地跟踪任务的执行情况。
5.任务重试:如果任务失败,Hangfire 可以自动重试任务,并且支持自定义重试策略。
6.任务分布式处理:Hangfire 可以在多个服务器或进程之间分配任务,使得任务处理可以横向扩展,从而提高处理能力和可靠性。
应用场景
Hangfire 适用于各种需要后台任务处理的场景,包括但不限于:
定时任务:执行定期的维护任务、生成报告、同步数据等。
异步任务处理:处理用户上传的文件、发送电子邮件、生成复杂的数据处理等。
后台工作:在后台处理长时间运行的任务,而不阻塞用户请求的执行。
任务调度和管理:创建、管理和监控任务,确保任务按照预期的时间和频率执行。
使用Hangfire
本文以.net6示例
安装 Hangfire
控制台安装
Install-Package Hangfire.Core
Install-Package Hangfire.Dashboard.BasicAuthorization
Install-Package Hangfire.HttpJob
Install-Package Hangfire.SqlServer
包管理器安装
配置Hangfire
在Program.cs文件中 添加以下代码
using Hangfire;
using Hangfire.Dashboard.BasicAuthorization;
using Hangfire.SqlServer;var builder = WebApplication.CreateBuilder(args);
//添加hangfire服务
builder.Services.AddHangfire(configuration => configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_170) // 设置数据兼容性级别为 1.7 版本.UseSimpleAssemblyNameTypeSerializer() // 使用简单的程序集名称类型序列化器.UseRecommendedSerializerSettings() // 使用推荐的序列化器设置.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions{//持久化CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), // 批处理作业的最大超时时间为 5 分钟SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), // 作业的可见性超时时间为 5 分钟QueuePollInterval = TimeSpan.FromSeconds(5), // 检查作业队列的间隔时间为 5 秒JobExpirationCheckInterval = TimeSpan.FromHours(1),//- 作业到期检查间隔(管理过期记录)。默认值为1小时。CountersAggregateInterval = TimeSpan.FromMinutes(5),//- 聚合计数器的间隔。默认为5分钟。//DashboardJobListLimit=5000,//- 仪表板作业列表限制。默认值为50000。TransactionTimeout = TimeSpan.FromMinutes(1),//- 交易超时。默认为1分钟。UseRecommendedIsolationLevel = true, // 使用推荐的事务隔离级别DisableGlobalLocks = true // 禁用全局锁定机制}));builder.Services.AddHangfireServer(); // 添加 Hangfire 服务器var app = builder.Build();
//启用仪表盘
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{Authorization = new[] {new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{RequireSsl = false, // 是否需要SSL连接,默认为falseSslRedirect = false, // 是否启用SSL重定向,默认为falseLoginCaseSensitive = true, // 登录名是否区分大小写,默认为true//Users = new BasicAuthAuthorizationUser[] {}, //未设置登录凭据Users = new []{new BasicAuthAuthorizationUser{Login = "admin", // 管理员登录名PasswordClear = "123456" // 管理员密码}}})},IsReadOnlyFunc = (context) => false // 设置仪表盘为可写模式
});
在appsettings.json文件中配置链接数据库的信息
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning"//"Microsoft.AspNetCore": "Warning",//"Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"}},"ConnectionStrings": {"Default": "Server=127.0.0.1;database=test; Persist Security Info=True;User ID=sa;Password=123;Packet Size=512;Encrypt=True;TrustServerCertificate=True;MultipleActiveResultSets=True","HangfireConnection": "server=127.0.0.1;database=test;uid=sa;pwd=123;TrustServerCertificate=true"},"AllowedHosts": "*"
}
创建任务调度
在Program.cs文件中 添加以下代码。在程序启动前,也就是在app.Run();之前
//RecurringJob.AddOrUpdate("每分钟执行一次", () => Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")), Cron.Minutely());
RecurringJob.AddOrUpdate<IBackgroundAuditTasksService>("review", e => e.BackendReviewAsync(), "*/2 * * * *");//每两分钟执行一次任务
app.Run();
编写任务接口
namespace test.Application.Interface.demo
{public interface IBackgroundAuditTasksService{/// <summary>/// 后台审核/// </summary>/// <param name="input"></param>/// <returns></returns>Task BackendReviewAsync();}
}
实现接口
namespace test.Application.ServiceImplementation.demo
{public class BackgroundAuditTasksService : IBackgroundAuditTasksService{private readonly ICache _cache;public BackgroundAuditTasksService(ICache cache){_cache = cache;}public async Task BackendReviewAsync(){//throw new NotImplementedException();await TestAsync();}public async Task TestAsync(){//Do something}}
}
在程序启动时会自动创建Hangfire数据库
访问仪表盘
访问 http://ip:port/hangfire 可以查看任务的状态和历史记录等信息。
当发布托管到iis可能会遇见Hangfire任务停止的情况,这时候怎么处理呢?可以查看我的另一篇文章https://blog.csdn.net/qq_39569480/article/details/140394221?spm=1001.2014.3001.5502
相关文章:

C# .net6使用Hangfire
首先我们先来了解什么是Hangfire? Hangfire 是一个用于 .NET 的任务调度库,允许你在后台运行任务,而不需要依赖外部的任务队列服务或复杂的基础设施。它简化了后台任务的创建、调度和管理过程,使得在 .NET 应用程序中处理长期运行…...
NaiveUI与ElementUI 比较分析
前言 在前端开发的广阔领域中,Vue.js作为最流行的前端框架之一,为开发者提供了丰富的组件库,其中NaiveUI和ElementUI是两个备受瞩目的选择。本文将深入分析这两个组件库的特点、优劣势以及适用场景,帮助开发者在项目中做出更合适…...
使用ChatGPT来撰写和润色学术论文的教程(含最新升级开桶ChatGpt4教程)
现在有了ChatGPT4o更加方便了, 但次数太少了 想要增加次数可以考虑升级开桶ChatGpt4 一、引言 在学术研究中,撰写高质量的论文是一项重要的技能。本教程将介绍如何利用ChatGPT来辅助完成从论文构思到润色的全过程。 二、使用ChatGPT写论文 1. 写标题 Title/T…...

matine组件库踩坑日记 --- react
Mantine实践 一 禁忌核心css样式二 添加轮播图扩展组件 一 禁忌核心css样式 import React from react import ReactDOM from react-dom/client import { BrowserRouter } from react-router-dom; import App from ./App.jsx import ./index.css import mantine/core/styles.cs…...
爬虫学习前记----Python
引言 1.语言:python 2.学习资源:【Python爬虫】 3.爬虫日记: python内容 1.字符串输出 (1)引号问题 print("python") 输出:pythonprint(python) 输出:pythonprint(python"学习") 输出&…...
详解Go语言中的Goroutine组(Group)在项目中的使用
背景(Why) Go语言通过其内置的goroutine和通道(channel)机制,提供了强大的并发支持。goroutine的开销非常低,一个goroutine仅占用几KB的内存,可以轻松创建成千上万个goroutine来处理并发任务。然而,随着并…...

Linux桌面环境手动编译安装librime、librime-lua以及ibus-rime,提升中文输入法体验
Linux上的输入法有很多,大体都使用了Fcitx或者iBus作为输入法的引擎。相当于有了一个很不错的“地基”,你可以在这个“地基”上盖上自己的“小别墅”。而rime输入法,就是一个“毛坯别墅”,你可以在rime的基础上,再装修…...

一文入门【NestJs】Providers
Nest学习系列 ✈️一文入门【NestJS】 ✈️一文入门【NestJs】Controllers 控制器 🚩 前言 在NestJS的世界里,理解“Providers”是构建健壮、可维护的后端服务的关键。NestJS,作为Node.js的一个现代框架,采用了Angular的一些核…...
云原生(Cloud native)
云原生(Cloud native) 一 定义 目前比较权威的定义主要来自Pivotal公司和云原生计算基金会(Cloud Native Computing Foundation,简称CNCF)。 1.1 Pivotal 4个要点: DevOps、持续交付、微服务、容器化。六…...
JVM OutOfMemoryError异常模拟
1.Java堆溢出 Java堆用于储存对象实例,我们只要不断地创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会 产生内存溢出异常。 限制Java …...

架构师机器学习操作 (MLOps) 指南
MLOps 是机器学习操作的缩写,是一组实践和工具,旨在满足工程师构建模型并将其投入生产的特定需求。一些组织从一些自主开发的工具开始,这些工具在每次实验后对数据集进行版本控制,并在每个训练周期后对检查点模型进行版本控制。另…...

【学习笔记】虚幻SkeletalMesh学习(一)基础介绍
文章目录 零、前言一、资源介绍1.1 骨架资源1.2 骨架网格体资源 二、UE4中的定义2.1 骨骼数据2.2 模型网格数据 三、渲染3.1 RenderData的初始化3.2 渲染对象的创建3.3 渲染对象的更新3.3.1 游戏线程的更新(*FSkeletalMeshObjectGPUSkin::Update*)3.3.2 …...

Apache防盗链、网页压缩、网页缓存
目录 网页压缩 类型 示例 动态添加模块操作步骤 重装Apache操作步骤 网页缓存 示例 操作步骤 隐藏版本信息 操作步骤 Apache防盗链 定义 原理 配置防盗链实验环境 实验环境 本地图片盗链示例 操作步骤 防盗链示例 操作步骤 网页压缩 网站的访问速度是由多个…...
LocalAI - 笔记
1.localAI https://localai.io/ 2 使用笔记本电脑搭建本地LLMs大模型环境 使用笔记本电脑搭建本地LLMs大模型环境 - 大模型知识库|大模型训练|开箱即用的企业大模型应用平台|智能体开发|53AI 3LocalAI视频 【LocalAI】(3):超级简单&…...
Windows图形界面(GUI)-SDK-C/C++ - 编辑框(edit)
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 编辑框(edit) 控件样式 创建控件 初始控件 消息处理 示例代码 编辑框(edit) 控件样式 编辑框(Edit Control)是Windows中最常用的控件之一,用于接收用户…...

区块链学习05-web3中solidity和move语言
Solidity 和 Move 语言的比较:Web3 开发中的两种选择 Solidity 和 Move 都是用于开发区块链平台智能合约的编程语言。它们具有一些相似之处,但也存在一些关键差异。 相似之处: Solidity 和 Move 都是图灵完备语言,这意味着它们可以表达计算…...
web滚动页面到指定位置
方法:scrollTo(x-coord,y-coord) 方法是Web API中Element接口的一部分,但它主要用于Window对象或可滚动的元素(如具有overflow属性为auto或scroll的<div>)。此方法用于将窗口滚动到文档中的特定位置,或者将某个元…...
操作系统真象还原:实现文件写入
14.7 实现文件写入 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 本节要实现的 sys_write 是系统调用 write 的内核实现,咱们之前的 write 是个简易版,它是为了临时完成输出打印的功能,不支持文件描述符。如今要让…...

FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题
其实代码没有问题,但是我们忽略了一个问题,就是在正常的开发中,肯定是遇到过这样的情况,我们频繁的有客户端链接,断开连接,需要统一的管理这些链接,那么应该如何管理呢。其实可以声明一个类去管…...

STM32智能楼宇照明系统教程
目录 引言环境准备智能楼宇照明系统基础代码实现:实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...