惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
F
Fortinet All Blogs
U
Unit 42
F
Full Disclosure
雷峰网
雷峰网
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
罗磊的独立博客
D
DataBreaches.Net
C
Check Point Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
O
OpenAI News
C
CXSECURITY Database RSS Feed - CXSecurity.com
aimingoo的专栏
aimingoo的专栏
S
Security @ Cisco Blogs
大猫的无限游戏
大猫的无限游戏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题
NISL@THU
NISL@THU
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Hacker News
The Hacker News
Webroot Blog
Webroot Blog
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
N
News | PayPal Newsroom
P
Proofpoint News Feed
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
C
Cybersecurity and Infrastructure Security Agency CISA
N
News and Events Feed by Topic
Google Online Security Blog
Google Online Security Blog
H
Help Net Security
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
M
MIT News - Artificial intelligence
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
IT之家
IT之家
MyScale Blog
MyScale Blog
腾讯CDC

博客园 - Hey,Coder!

Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard docker consul registrator 服务自动注册consul 微服务动态扩容 ubuntu24.04 安装docker RAG 检索增强生成 软考 - 架构设计师 知识点总结 c# MailKit3.4.3 发送邮件、附件 nginx 反向代理postgresql c# 信号量 elsa 3.5 中间件记录最后执行的节点数据 xp密钥 c# System.Text.Json 反序列化Dictionary<string,object>时未转换基础类型的处理方法 docker配置代理 openclaw 接入 LMStudio的模型服务 wpf canvas 移动 缩放 windows平台openclaw搭建 wpf scrollerview触摸滚动 c# 动态切换sqlsugar连接字符串 c# Elastic.Clients.Elasticsearch 动态查询 c# es 封装Elastic.Clients.Elasticsearch c# scrollerview滚动到指定元素位置 WPF 重写Expander 基于elsa工作流封装一套变量、组件的体系 常用活动重写 DynamicExpresso 轻量级动态表达式库 c# elsa 3.5.2 程序化工作流常用功能及自定义中间件 leaflet docker 连接老版本的sqlserver ssl错误 cefsharp 模拟点击 批量重置数据库的数据 docker 复制远程镜像本地并创建容器 c# newtonsoft dynamic
c# quartz 动态创建任务 控制任务运行和停止 依赖注入
Hey,Coder! · 2026-01-05 · via 博客园 - Hey,Coder!

编写job

在Execute中添加定时任务的逻辑

   public class ScheduleJob : IJob
   {
       /// <summary>
       /// 
       /// </summary>
       /// <param name="context"></param>
       /// <returns></returns>
       public async Task Execute(IJobExecutionContext context)
       {
           Console.WriteLine($"{DateTime.Now.ToString("yy-MM-dd HH:mm:ss fff")},执行了Job");
           await Task.CompletedTask;
       }

   }

创建任务

通过IJobDetail来绑定job信息,ITrigger维护定时的间隔,StdSchedulerFactory 创建实际执行的任务。
通过scheduler这个实例对象控制任务启动和停止。
await scheduler.Start();
await scheduler.ScheduleJob(job, trigger);
await scheduler.Standby();

可以用 await StdSchedulerFactory.GetDefaultScheduler();获取默认的调度器,也可以自定义创建

IJobDetail job = JobBuilder.Create<TestJob>()
    .WithIdentity("TestJob", "myGroup")
    .Build();


ITrigger trigger = TriggerBuilder.Create()
    //.WithIdentity("TestJobTrigger", "myGroup")
    .WithCronSchedule("0 15 10 * * ?")
    .Build();


StdSchedulerFactory factory = new StdSchedulerFactory();
//创建任务调度器
IScheduler scheduler = await factory.GetScheduler();
//启动任务调度器
await scheduler.Start();

//将创建的任务和触发器条件添加到创建的任务调度器当中
await scheduler.ScheduleJob(job, trigger);

Console.WriteLine("任务调度器已启动,按任意键退出...");
//停止任务
//scheduler.Standby();

获取最近几次执行时间

//方式一
   CronExpression cronExpression = new CronExpression("0 15 10 * * ?");

   DateTimeOffset current = DateTime.Now;

   List<DateTime> result = new List<DateTime>();
   for (int i = 0; i < 5; i++)
   {
       var nextOffset = cronExpression.GetNextValidTimeAfter(current);

       var nextTime = nextOffset.Value.DateTime;
       result.Add(nextTime);
       current = nextOffset.Value;
   }


//方式二
var fireTimes = new List<DateTimeOffset>();

// 设置计算的起始时间,默认为当前时刻
var baseTime = DateTimeOffset.UtcNow;
DateTimeOffset? current = baseTime;

//根据Cron表达式构建触发器
// 注意:此处假设使用本地时间。如需特定时区,请使用`.InTimeZone`方法配置
ITrigger trigger = TriggerBuilder.Create()
    .WithCronSchedule("0 15 10 * * ?")
    .Build();


//  循环计算后续触发时间
for (int i = 0; i < 5; i++)
{
    current = trigger.GetFireTimeAfter(current);
    if (current == null) break; // 如果已经没有后续触发时间,则退出循环
    fireTimes.Add(current.Value);
}

依赖注入

  1. 添加一个JobFactory
 public class JobFactory : IJobFactory
 {
     private readonly IServiceProvider _serviceProvider;

     public JobFactory(IServiceProvider serviceProvider)
     {
         _serviceProvider = serviceProvider;
     }

     public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
     {
         return _serviceProvider.GetService<ScheduleJob>();
     }

     public void ReturnJob(IJob job)
     {
         var disposable = job as IDisposable;
         disposable?.Dispose();
     }
 }
  1. 在原先创建任务调度器的地方添加JobFactory
 //创建任务调度器
 IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();

//传入serviceProvider
 scheduler.JobFactory = new JobFactory(serviceProvider);
 await scheduler.Start();
 await scheduler.ScheduleJob(job, trigger);
 Console.WriteLine("任务调度器已启动,按任意键退出...");
  1. 在原先的Job内部使用依赖注入
public class ScheduleJob : IJob
{
    public static string ConfigKey { get; set; } = "Config";

    IScheduleTaskService scheduleTaskService;

    public ScheduleJob(IScheduleTaskService scheduleTaskService)
    {
        this.scheduleTaskService = scheduleTaskService;
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public async Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine($"{DateTime.Now.ToString("yy-MM-dd HH:mm:ss fff")},执行了TestJob");
        await Task.CompletedTask;
    }

}

[参考]
C# 定时任务 Quartz.NET 的使用