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 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
默_笙6 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003966 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技6 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
此时不提桶,更待何时6 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读6 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
这个DBA有点耶6 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G6 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备6 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
只睡四小时6 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas