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

相关推荐
evans在进步9 分钟前
LeetCode 33:搜索旋转排序数组——Java 两阶段二分查找详解
java·python·leetcode
倒流时光三十年17 分钟前
PostgreSQL Semi-Join(半连接)通俗讲解
数据库·postgresql
言乐642 分钟前
Python游戏水平测试辅助系统2
开发语言·windows·python·游戏·django
NiceCloud喜云1 小时前
腾讯云国际版云数据库选型:MySQL、Redis 怎么按业务架构来判断
数据库·mysql·腾讯云
ew452181 小时前
MySQL JOIN 关联语法、差异、标准用法、经典坑点汇总
数据库·mysql
Rain的Java大神之路2 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Nturmoils2 小时前
给运营导个 CSV,在 ksql 里用 \copy 就够了
数据库
jerryinwuhan2 小时前
《Python数据预处理》第四章
开发语言·python
ciqingloveless2 小时前
Oracle打开数据库加密
数据库·oracle
雨晨源码(同名B站)2 小时前
基于Python的网易云音乐评论数据情感化分析系统 音乐爬虫信息可视化 |SnowNLP评论情感分析
开发语言·hadoop·爬虫·python·信息可视化·毕业设计