C#怎么实现定时任务 C#如何用Timer和Quartz.NET创建定时执行的后台任务【技巧】

System.Threading.Timer最适合作为后台长任务的轻量轮询方案,因其单线程回调避免线程池耗尽,而System.Timers.Timer适合秒/分钟级简单任务但需防并发;Quartz.NET适用于复杂调度需求但配置复杂。用 System.Timers.Timer 做简单轮询,但别指望它精准它适合每秒/每分钟级的轻量任务,比如心跳上报、缓存刷新。底层靠线程池回调,不保证准时------如果 Elapsed 事件处理太慢,下一次触发会被延迟甚至丢弃。必须手动调用 Start(),构造完默认是停着的AutoReset 设为 false 才能只执行一次;设为 true(默认)才循环,但要注意避免重复触发:多个 Elapsed 可能并发执行,得自己加锁或用 Interlocked别在回调里直接 Stop() + Start() 重置间隔,会引发竞态;改用 Change() 方法(System.Threading.Timer 才有,System.Timers.Timer 没这接口)应用退出前记得调用 Dispose(),否则可能阻止进程结束用 Quartz.NET 做生产级调度,但别一上来就配集群它解决的是"每月最后一个周五上午9点发邮件"这类复杂表达式,也支持持久化、故障恢复和分布式协调。但本地开发时,RAMJobStore 就够用,硬上 AdoJobStore 反而多出数据库连接、表初始化、连接泄漏等坑。触发器表达式写错常见于少写空格,比如 "0 0 9 ? * FRI" 合法,"0 0 9?*FRI" 直接抛 ParseExceptionJob 类必须有无参构造函数,且不能是内部类(反射实例化失败)如果用 async 方法,别直接 await 在 Execute() 里------Quartz 默认同步调用,要封装成 Task.Run(() => { ... }) 或改用 IJobFactory 注入异步上下文日志里出现 "Trigger 'xxx' is set to fire now, but scheduler is in standby mode"?说明调用了 Standby() 没 Start()为什么 System.Threading.Timer 比 System.Timers.Timer 更适合后台长任务前者回调只用一个线程(可指定 ThreadPool 或 Null),后者每次 Elapsed 都可能从线程池拿新线程,容易打满池子。尤其当任务偶尔卡住,前者最多阻塞下一次,后者可能堆积一堆等待线程。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
金銀銅鐵9 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li11 小时前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸16 小时前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学17 小时前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
jiayou6418 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
花酒锄作田1 天前
Pydantic校验配置文件
python
hboot1 天前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
ZhengEnCi2 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi2 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab