×

C# 后台任务调度器

独孤求败 独孤求败 发表于2026-02-11 10:44:31 浏览16 评论0

抢沙发发表评论

项目中很多时候需要同步第三方接口数据,如果是人为来进行同步,费时费人力是不可取的。

通常会在后台开发定时任务同步数据比如间隔30分钟运行任务同步。

C# 提供很多好用的第三方库进行任务调度如Quartz.NET。

Quartz.NET是 一个开源的.NET作业调度库可以在特定时间执行一些任务如定时任务,周期性任务,一次性任务等。使用非常灵活简单,可以通过NuGet包管理器来安装它。

在Visual Studio中,你可以通过

“工具”->“NuGet包管理器”->“管理解决方案的NuGet程序包” 来搜索并安装Quartz。

图片.png

Quartz类库核心概念

IJob:任务接口,实现IJob接口的Execute方法,其包含要执行任务的具体业务逻辑。

Trigger:任务触发器,定义什么时候进行任务触发执行。

Scheduler:任务调度器,主要负责安排和触发任务,即将要执行的方法挂载在里面执行调度。

JobDetail:任务的具体信息,如任务名称和描述信息。

using Quartz;
using Quartz.Impl;
using System;
using System.Threading.Tasks;
namespace A_JobScheduler
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建 StdSchedulerFactory 的实例
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            try
            {
                // 使用工厂创建调度器实例
                IScheduler scheduler = schedulerFactory.GetScheduler().Result;
                // 初始化调度器
                scheduler.Start();
                // 定义一个任务(JobDetail)
                IJobDetail job = JobBuilder.Create<MyJob>()
                     .WithIdentity("myJob", "group1")
                    .Build();
                // 定义一个触发器(Trigger)
                ITrigger trigger = TriggerBuilder.Create()
                     .WithIdentity("myTrigger", "group1")
                    .StartNow() // 立即开始执行任务
                    .WithSimpleSchedule(x => x
                        .WithIntervalInSeconds(3) // 每3秒执行一次
                        .RepeatForever()) // 重复执行
                    .Build();
                // 将任务和触发器绑定到调度器上,并开始执行
                scheduler.ScheduleJob(job, trigger);
                Console.ReadLine(); 
            }
            catch (SchedulerException se)
            {
                Console.WriteLine($"SchedulerException occurred: {se.Message}");
            }
        Console.ReadKey();
        }
    }
    //定义一个任务类实现IJob接口
    class MyJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            Console.WriteLine(context.JobDetail.Key.Group+":Job Running.." +DateTime.Now);
            return Task.CompletedTask;
        }
    }
}

输出:

  • group1:Job Running..2026/2/8 15:36:42

  • group1:Job Running..2026/2/8 15:36:45

  • group1:Job Running..2026/2/8 15:36:48


群贤毕至

访客