C#怎么实现后台定时任务_C#如何使用Quartz框架【进阶】

裘德小鎮的故事

裘德小鎮的故事

2026-03-29

442人浏览

原创

quartz.net任务未触发的首要原因是未调用ischeduler.start(),导致触发器处于standby状态;job类须有无参构造函数,依赖服务应在execute中通过createscope获取;cron表达式必须为6位;并发执行需用[disallowconcurrentexecution]避免死锁。

c#怎么实现后台定时任务_c#如何使用quartz框架【进阶】

Quartz.NET 任务没触发?先检查 IScheduler.Start() 调用时机

很多任务“写好了但根本不跑”,根本原因不是配置错,而是调度器压根没启动。Quartz.NET 不像 Windows 服务那样装完就自启——IScheduler 实例创建后必须显式调用 Start(),否则所有触发器都处于 STANDBY 状态,日志里也几乎不报错。

常见错误现象:StdSchedulerFactory.GetScheduler() 后直接定义 Job 和 Trigger,没等 await scheduler.Start() 就结束了程序(比如在 Console 应用的 Main 方法末尾退出)。

  • Web 应用中,务必在 ApplicationStartedIHostedService.StartAsync() 中调用 Start(),不能放在构造函数或 ConfigureServices
  • Console 应用需保持主线程存活(如 Console.ReadLine()),否则进程退出,调度器随之销毁
  • Start() 是异步方法,若忽略 await,可能在启动完成前就执行了后续逻辑

Job 类必须有无参构造函数,且不能依赖注入 IServiceScope

Quartz.NET 默认使用 SimpleJobFactory 创建 Job 实例,它只认无参构造函数。如果你写了带参数的构造函数又没保留无参版本,运行时会抛 System.MissingMethodException: No parameterless constructor defined

更隐蔽的问题是:有人试图在 Job 构造函数里直接注入 IDbContextFactory<appdbcontext></appdbcontext> 这类服务,结果发现 DbContext 操作失败或连接被释放——因为 Job 实例生命周期由 Quartz 管理,不在 ASP.NET Core 的作用域内。

  • Job 类应保持无状态、无依赖,所有外部服务通过 JobDataMap 或工厂模式延迟获取
  • 需要 DI 支持?换用 Microsoft.Extensions.DependencyInjection.Quartz.ServiceCollectionExtensions 提供的 AddQuartz() + AddQuartzServer(),并配合 JobFactory 实现类接管实例创建
  • 若必须用 DbContext,应在 Execute(IJobExecutionContext context) 内部用 serviceProvider.CreateScope() 新建作用域,用完立即释放

CronTrigger 表达式里秒数字段不能省,.NET 版本要求严格

Java 版 Quartz Cron 是 6 位(秒 分 时 日 月 周),而 .NET 社区早期文档常误传为 5 位(分 时 日 月 周)。Quartz.NET 从 3.x 开始强制要求 6 位,写成 "0 0 * * * ?" 是合法的,但 "0 * * * ?" 会直接抛 Quartz.SchedulerException,提示表达式解析失败。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载

容易踩的坑还包括:

  • 周几字段用数字(1=周日,7=周六)还是英文缩写(SUN、MON)?两者都支持,但混用易出错;推荐统一用数字+问号,如 "0 0 12 ? * 2-6"(工作日中午执行)
  • 年份字段(第 7 位)极少用,加了反而增加兼容性风险,官方示例默认不写
  • 测试表达式?别靠猜——用 CronExpression.IsValidExpression("...") 提前校验,比上线后看日志快得多

并发执行导致数据库死锁?给 Job[DisallowConcurrentExecution]

默认情况下,同一个 Job 类的多个实例可以同时执行(比如上一次执行还没结束,下一次触发又到了)。这在发邮件、调第三方 API 时可能问题不大,但一旦涉及更新同一张表的某几行(比如定时刷新缓存计数器),就极易触发 SQL Server 死锁或 PostgreSQL 的 deadlock detected 错误。

[DisallowConcurrentExecution] 是最轻量的解决方式,它让 Quartz 自动对 Job 类名加分布式锁,确保同一时间最多一个实例运行。

  • 该特性只对同一 IJob 类型生效,不同 Job 类之间不受影响
  • 注意:锁是基于 JobKey(名称+组名)的,如果动态生成 JobKey 且未去重,锁就失效
  • 如果真需要并行但规避冲突,得改业务逻辑——比如把大任务拆成按 ID 区间分片,每个分片用独立 JobKey

Quartz.NET 的麻烦不在配置多,而在它的生命周期和执行模型跟 ASP.NET Core 的 DI/Scope 完全不重叠。最容易被忽略的,其实是 Job 实例的创建时机和作用域边界——那里没有 using 块帮你兜底,也没有 GC 自动清理未释放的数据库连接。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1158

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

137

20

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

2025.12.24

618

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习