在 .NET 或 .NET Core 应用中,若需在不依赖 Windows 服务、独立进程的前提下实现后台处理,Hangfire 是最成熟、简单的方案之一 —— 它可直接嵌入现有应用(如 ASP.NET Core Web 应用),无需额外部署,同时提供任务持久化、监控和重试能力。以下从 核心优势、快速集成步骤、关键用法 三方面,梳理如何用 Hangfire 实现后台处理:

一、为什么选择 Hangfire(核心优势)

  1. 零额外部署:可直接嵌入 Web 应用、控制台应用,无需单独部署 Windows 服务或计划任务;
  2. 任务持久化:支持 SQL Server、MySQL、Redis 等存储,应用重启后未执行的任务不会丢失;
  3. 可视化监控:自带 Dashboard 控制台,可实时查看任务状态(成功 / 失败 / 排队)、执行日志、重试记录;
  4. 多任务类型支持:覆盖常见后台场景(一次性任务、定时任务、周期性任务);
  5. 高可靠性:自动重试失败任务,支持任务优先级(队列区分),避免单点故障。
Install-Package Hangfire.AspNetCore
Install-Package Hangfire.MySqlStorage
    #region Hangfire与MySQLstring connString = configuration.GetConnectionString("Hangfire")?? throw new ArgumentException("未找到Hangfire连接字符串");context.Services.AddHangfire(config =>{config.SetDataCompatibilityLevel(CompatibilityLevel.Version_180).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings();config.UseStorage(new MySqlStorage(connString, new MySqlStorageOptions()));});context.Services.AddHangfireServer();context.Services.AddTransient<IBackgroundJobClient, BackgroundJobClient>();#endregion#region 定义Queuescontext.Services.AddHangfireServer(options =>{options.Queues = new[] { "maintenance-plan-overtime" };options.WorkerCount = 1;});#endregion
}public override async Task OnApplicationInitializationAsync(
ApplicationInitializationContext context)
{await context.AddBackgroundWorkerAsync<LimitRecordWorker>();
}public override Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context)
{const string NAME = "HangfirePeriodicBackgroundWorkerAdapter<BackgroundJobWorker>.DoWorkAsync";RecurringJob.RemoveIfExists(NAME);return base.OnPostApplicationInitializationAsync(context);
}

如果你想使用 Hangfire Dashboard 来查看和管理后台任务,你需要在 Configure 方法中添加相应的中间件:

app.UseHangfireDashboard();

定时任务:

public class LimitRecordWorker : HangfireBackgroundWorkerBase
{private readonly IAbpDistributedLock _distributedLock;private readonly IUnitOfWorkManager _unitOfWorkManager;private readonly IBackgroundJobManager _backgroundJobManager;public LimitRecordWorker(IAbpDistributedLock distributedLock,IUnitOfWorkManager unitOfWorkManager,IConfiguration configuration,IBackgroundJobManager backgroundJobManager){_distributedLock = distributedLock;_unitOfWorkManager = unitOfWorkManager;RecurringJobId = nameof(LimitRecordWorker);_backgroundJobManager = backgroundJobManager;CronExpression = configuration["Crons:LimitRecordCron"];}public override async Task DoWorkAsync(CancellationToken cancellationToken = default){await using (var handle = await _distributedLock.TryAcquireAsync("LimitRecordDistributedLock", TimeSpan.FromSeconds(10))){if (handle != null){using (var uow = LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>().Begin()){Log.Information("LimitRecordWorker" + DateTime.Now);for (int i = 0; i <= 5; i++){MaintenancePlanOverTimeArgs workProcedureLeaderArgs = new MaintenancePlanOverTimeArgs();workProcedureLeaderArgs.Serial = i;await _backgroundJobManager.EnqueueAsync(workProcedureLeaderArgs, delay: TimeSpan.FromHours(workProcedureLeaderArgs.OverTime % 24));}await uow.CompleteAsync();}}}}
}

队列服务:

[Queue("maintenance-plan-overtime")]public class MaintenancePlanOverTimeJob : AsyncBackgroundJob<MaintenancePlanOverTimeArgs>, ITransientDependency{public MaintenancePlanOverTimeJob(){}public override async Task ExecuteAsync(MaintenancePlanOverTimeArgs args){Log.Information("MaintenancePlanOverTimeJob:" + args.Serial + "--" + DateTime.Now);}}public class MaintenancePlanOverTimeArgs{public int Serial { get; set; }public List<Guid> EmployeeIds { get; set; }public Guid DepartmentId { get; set; }public Guid? WorkProcedureId { get; set; }public Guid? DeviceDetailTypeId { get; set; }public double OverTime { get; set; }}

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96565.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96565.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96565.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站漏洞扫描要怎么处理?

在网络安全领域&#xff0c;网站漏洞是黑客攻击的重要突破口&#xff0c;而网站漏洞扫描能及时发现这些隐患。但很多小白在完成漏洞扫描后&#xff0c;不清楚后续该如何处理&#xff0c;导致漏洞一直存在&#xff0c;给网站安全埋下风险。下面从准备工作、处理步骤、验证维护等…

淘宝RecGPT:通过LLM增强推荐

导论背景 (Background)​​推荐系统的核心挑战​​&#xff1a;怎么 准确推断 用户行为背后快速变化的真实意图&#xff0c;以实现用户、商户和平台的三赢。​​现有方法的局限性​​&#xff1a;传统的基于历史日志共现模式&#xff08;“从点击学习点击”&#xff09;的模型&…

【Go系统编程】07 网络化IPC:Go的王牌——Socket编程

大家好&#xff0c;我是Tony Bai。欢迎来到我们《Go 系统编程》专栏的最后一讲。在过去的旅程中&#xff0c;我们探索了管道、消息队列、共享内存等一系列强大的 IPC 机制。它们各有所长&#xff0c;但都有一个共同的、致命的局限性&#xff1a;它们都只能在同一台物理机上工作…

claude code使用小窍门

视频地址 B站 1 /init 在项目最开始的时候&#xff0c;使用/init可以将项目通读一遍。cc会将学习到的关于项目的知识都保存到CLAUD.MD文件中 2、 /compact 用来压缩对话的上下文&#xff0c;claude会将之前的一些乱七八糟或者重复的对话删除压缩&#xff0c;有利于提高AI的…

The learning process of Decision Tree Model|决策树模型学习过程

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

期货盘后空开是认购期权行权?

本文主要介绍期货盘后空开是认购期权行权&#xff1f;期货盘后空开与认购期权行权是两个独立的概念&#xff0c;无直接关联&#xff0c;需从交易机制、操作逻辑及市场规则三方面区分。期货盘后空开是认购期权行权&#xff1f;1. 定义与交易属性期货盘后空开&#xff1a;属于期货…

ESP32 I2S音频总线学习笔记(七):制作一个录音播放器

简介 上一篇我们利用I2S输出DIY了一个蓝牙音箱简单玩了一下&#xff0c;本篇我们继续来看代码。前面几篇文章我们分别介绍了I2S输入&#xff0c;I2S输出&#xff0c;以及WAV文件格式的相关内容&#xff0c;那我们就可以根据所学到的&#xff0c;制作一个录音机&#xff0c;具体…

PyTorch 动态图的灵活性与实用技巧

PyTorch 以其动态计算图&#xff08;Dynamic Computation Graph&#xff09;而闻名&#xff0c;这赋予了它极高的灵活性和易用性&#xff0c;使其在研究和实际应用中都备受青睐。与TensorFlow 1.x的静态图&#xff08;需要先定义图结构&#xff0c;再运行&#xff09;不同&…

#C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言刷题合集》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;"代码行数决定你的下限&#xff0c;算法思维决定你的上限。" 前言&#xff1a;在学习…

复杂PDF文档结构化提取全攻略——从OCR到大模型知识库构建

在学术研究、金融分析、法律合同、工程设计等众多领域&#xff0c;PDF文档已成为信息存储与传递的重要载体。然而&#xff0c;面对包含复杂表格、公式、图表、手写批注、多栏排版等元素的PDF&#xff0c;传统工具往往难以准确、完整地提取内容。这不仅影响信息利用效率&#xf…

HttpClient、OkHttp 和 WebClient

HttpClient、OkHttp 和 WebClient 是 Java 生态中常见的 HTTP 客户端&#xff0c;它们在设计理念、异步能力、性能等方面有所不同。以下是它们的详细对比&#xff1a;1. 概述客户端介绍Apache HttpClient传统同步 HTTP 客户端&#xff0c;功能丰富&#xff0c;历史悠久&#xf…

书籍成长书籍文字#创业付费杂志《财新周刊》2025最新合集 更33期

免费访问地址 https://isharehubs.com/article/2025-33-26c27ee5bb9180cdafc5efbec9545ac5 资源信息 付费杂志《财新周刊》2025最新合集 更33期 《财新周刊》2025 最新合集&#xff08;更至 33 期&#xff09;重磅上线&#xff0c;聚焦年度热点与结构性变化&#xff0c;从监…

用python的socket写一个局域网传输文件的程序

局域网传输文件是最最常用的功能&#xff0c;我参考https://www.jb51.net/python/345837qrz.htm这篇文章&#xff0c;复制粘贴&#xff0c;开发了一个。但发现进度条没有用&#xff0c;也没有显示传输用时和传输速度的功能&#xff0c;于是我改写了代码&#xff0c;使它实现这个…

深度剖析Linux内核无线子系统架构

文章目录1、资料快车2、目录介绍2、术语3、Linux无线子系统概述4、内核无线子系统框架1&#xff09;认识内核无线子系统中的三个软件框架2、无线网络子系统框架3、Android WIFI Management框架1&#xff09;fullMAC和softMAC是什么&#xff1f;2&#xff09;fullmac对比softmac…

unity UGUI 鼠标画线

using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; using UnityEngine.UI; /* 使用方法&#xff1a; 在场景中新建一个空的 GameObject&#xff08;右键 -> UI -> 空对象&#xff0c;或直接创建空对象后添加 RectTransform 组件&am…

JSP疫情物资管理系统jbo2z--程序+源码+数据库+调试部署+开发环境

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。系统程序文件列表开题报告内容一、选题背景与意义新冠疫情的爆发&#xff0c;让医疗及生活物资的调配与管理成为抗疫工作的关键环节。传…

Mem0 + Milvus:为人工智能构建持久化长时记忆

作者&#xff1a;周弘懿&#xff08;锦琛&#xff09; 背景 跟 ChatGPT 对话&#xff0c;比跟真人社交还累&#xff01;真人好歹能记住你名字吧&#xff1f; 想象一下——你昨天刚把沙发位置、爆米花口味、爱看的电影都告诉了 ChatGPT&#xff0c;而它永远是那个热情又健忘的…

前端架构-CSR、SSR 和 SSG

将从 定义、流程、优缺点和适用场景 四个方面详细说明它们的区别。一、核心定义缩写英文中文核心思想CSRClient-Side Rendering客户端渲染服务器发送一个空的 HTML 壳和 JavaScript bundle&#xff0c;由浏览器下载并执行 JS 来渲染内容。SSRServer-Side Rendering服务端渲染服…

主动性算法-解决点:新陈代谢

主动性[机器人与人之间的差距&#xff0c;随着不断地人和人工智能相处的过程中&#xff0c;机器人最终最终会掌握主动性&#xff0c;并最终走向独立&#xff0c;也就是开始自己对于宇宙的探索。]首先:第一步让机器人意识到自己在新陈代谢&#xff0c;人工智能每天有哪些新陈代谢…