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

相关推荐
果汁华2 小时前
Claude Agent SDK Python:构建自主 AI 代理的官方引擎
开发语言·人工智能·python
User_芊芊君子2 小时前
从零入门!MySQL 约束、范式设计与联合查询核心精讲
数据库·人工智能·mysql
alwaysrun2 小时前
Python获取Steam平台安装游戏信息
python·游戏·steam·vdf
重生之我是Java开发战士2 小时前
【MySQL】视图:简化查询、保障安全的虚拟表
数据库·mysql
qq_413502022 小时前
CSS解决浮动布局中最后一行对齐_配合伪类或容器处理
jvm·数据库·python
2301_808414382 小时前
MySQL的基础认识
数据库·mysql
djjdjdjdjjdj2 小时前
Less如何优化CSS代码注释风格_利用Less特性保持规范.txt
jvm·数据库·python
m0_602857762 小时前
mysql如何编写递归存储过程_mysql max_sp_recursion_depth设置
jvm·数据库·python
WL_Aurora2 小时前
Python基础知识点全解析:从入门到精通
开发语言·python