我们在(API或者WEB)项目中,如果想执行后台任务,请勿使用Timer,因为对Timer的管理显得不是太友好,做一些循环的任务的话没问题,但如果是指定时间任务,如果控制不严谨的话会显得很费力。
我们更不要在项目中使用Task执行后台任务,因为一旦请求完毕,那么资源会被释放。此时Task就失败了。
那么我们可以使用Quartz来管理我们的后台任务。让任务变得健康有序。
项目引用
<PackageReference Include="XUCore.NetCore" Version="1.0.9" />
源码:EasyQuartz
引用:
using XUCore.NetCore.EasyQuartz;
在线配置Cron任务
Statup中注册Quartz服务
services.AddEasyQuartzService();
注册好即可使用。
那么接下来我们写一个任务
以下任务只需要放到项目中即可顺利执行。
demo1
[TriggerCron("0/5 * * * * ? *")] //设置任务为每5秒执行一次public class Test1Job : IJob{public Task Execute(IJobExecutionContext context){Console.WriteLine($"{DateTime.Now} Test1Job");return Task.CompletedTask;}}
demo2
这个例子是我们根据不同的环境获取Cron表达式来执行任务
public class Test2Job : EasyQuartzJob, IJob{private readonly IConfiguration _configuration;public Test2Job(IConfiguration configuration){_configuration = configuration;}public override string Cron => _configuration["Test2JobCron"];public Task Execute(IJobExecutionContext context){Console.WriteLine($"{DateTime.Now}我是 Test2Job");return Task.CompletedTask;}}
demo3
这个例子我们5分钟执行一次任务,并在任务中建立子任务。
[StartNow][TriggerCron("0 0/5 * * * ? ")]public class Test3Job : IJob{private readonly IJobManager _jobManager;public Test3Job(IJobManager jobManager){_jobManager = jobManager;}public async Task Execute(IJobExecutionContext context){Console.WriteLine($"{DateTime.Now}我是 Test3Job");await _jobManager.AddJobAsync(typeof(Test4Job), CronCommon.SecondInterval(2), "111111");}}[JobIgnore]public class Test4Job : IJob{private readonly IJobManager _jobManager;public Test4Job(IJobManager jobManager){_jobManager = jobManager;}public Task Execute(IJobExecutionContext context){JobDataMap dataMap = context.MergedJobDataMap;string jobId = dataMap.GetString("JobId");Console.WriteLine($"{DateTime.Now}Test4Job,参数{jobId}");//await _jobManager.RemoveJobAsync(typeof(Test4Job), jobId);return Task.CompletedTask;}}