在C#开发中,定时任务是常见的功能需求,不同场景下可以选择不同的实现方案,每种方案都有对应的适用场景和实现逻辑。

一、使用System.Timers.Timer实现简单定时任务
System.Timers.Timer是.NET框架自带的定时器类,适合实现简单的、对精度要求不高的定时任务,不需要引入第三方依赖。
基本使用步骤
首先需要创建Timer实例,设置定时器的间隔时间和触发事件,然后启动定时器即可。
using System;
using System.Timers;
namespace TimerDemo
{
class Program
{
static void Main(string[] args)
{
// 创建定时器,设置间隔为2000毫秒(2秒)
Timer timer = new Timer(2000);
// 绑定定时触发事件
timer.Elapsed += OnTimedEvent;
// 设置定时器自动重置,即每次间隔后都触发
timer.AutoReset = true;
// 启动定时器
timer.Enabled = true;
Console.WriteLine("定时任务已启动,按任意键退出...");
Console.ReadKey();
}
// 定时触发的方法
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine($"定时任务执行,当前时间:{DateTime.Now}");
}
}
}
需要注意的是,Timer的Elapsed事件是在线程池线程上执行的,如果任务执行时间超过间隔时间,可能会出现任务重叠执行的情况,需要根据实际需求处理。
二、使用Quartz实现复杂定时任务
如果需要实现复杂的定时规则,比如指定每天的某个时间点执行、每周固定几天执行、支持任务持久化等,推荐使用Quartz框架,它是功能强大的开源作业调度框架。
安装依赖
首先需要通过NuGet安装Quartz包,安装命令如下:
Install-Package Quartz
实现示例
Quartz的核心概念包括作业(IJob)、作业详情(IJobDetail)、触发器(ITrigger)、调度器(IScheduler),下面是一个每3秒执行一次的定时任务示例:
using Quartz;
using Quartz.Impl;
using System;
using System.Threading.Tasks;
namespace QuartzDemo
{
// 定义作业类,实现IJob接口
public class MyJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Task.Run(() =>
{
Console.WriteLine($"Quartz定时任务执行,当前时间:{DateTime.Now}");
});
}
}
class Program
{
static async Task Main(string[] args)
{
// 创建调度器工厂
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 获取调度器实例
IScheduler scheduler = await schedulerFactory.GetScheduler();
// 启动调度器
await scheduler.Start();
// 创建作业详情
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("myJob", "group1")
.Build();
// 创建触发器,设置每3秒执行一次
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(3)
.RepeatForever())
.Build();
// 将作业和触发器绑定到调度器
await scheduler.ScheduleJob(job, trigger);
Console.WriteLine("Quartz定时任务已启动,按任意键退出...");
Console.ReadKey();
// 关闭调度器
await scheduler.Shutdown();
}
}
}
Quartz支持Cron表达式,可以实现非常灵活的定时规则,比如0 0 12 * * ?表示每天中午12点执行,适合复杂的调度需求。
三、使用BackgroundService实现后台定时任务
在.NET Core及更高版本中,推荐使用BackgroundService来实现后台定时任务,它是微软提供的后台服务基类,适合长时间运行的后台任务,并且可以很好地集成到依赖注入体系中。
实现示例
首先需要创建继承自BackgroundService的服务类,重写ExecuteAsync方法实现定时逻辑:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace BackgroundServiceDemo
{
public class TimedBackgroundService : BackgroundService
{
private readonly ILogger<TimedBackgroundService> _logger;
private Timer _timer;
public TimedBackgroundService(ILogger<TimedBackgroundService> logger)
{
_logger = logger;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
// 初始化定时器,首次延迟5秒执行,之后每2秒执行一次
_timer = new Timer(DoWork, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(2));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation($"BackgroundService定时任务执行,当前时间:{DateTime.Now}");
}
public override void Dispose()
{
_timer?.Dispose();
base.Dispose();
}
}
}
然后在Program.cs中注册该后台服务:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace BackgroundServiceDemo
{
class Program
{
static void Main(string[] args)
{
Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
// 注册后台定时服务
services.AddHostedService<TimedBackgroundService>();
})
.Build()
.Run();
}
}
}
这种方式的定时任务会随着应用程序启动而启动,停止而停止,适合Web应用、微服务中的后台定时场景。
四、不同方案的选择建议
可以根据项目需求选择合适的定时任务实现方案:
- 如果是简单的控制台程序,定时规则简单,不需要复杂功能,优先选择System.Timers.Timer,无额外依赖。
- 如果需要复杂的定时规则、任务持久化、集群调度等功能,选择Quartz框架,功能更完善。
- 如果是.NET Core及以上版本的Web应用、微服务,需要实现后台长时间运行的定时任务,优先选择BackgroundService,集成度更高,符合框架设计理念。
C#定时任务TimerQuartzBackgroundService修改时间:2026-07-19 21:09:33