新建workserver 模板.net core 项目,会生成如下定时服务代码:
while (!stoppingToken.IsCancellationRequested) { var guid = Guid.NewGuid(); var time = DateTime.Now; _logger.LogInformation("xxx running at: {0},唯一标识:{1}", time, guid); Thread.Sleep(70000); _logger.LogInformation("xxx runend at: {0},唯一标识:{1},执行时长:{2}秒", DateTime.Now, guid, (DateTime.Now - time).TotalSeconds); await Task.Delay(60000, stoppingToken); }
如果我在其中加上如上标红的代码,会出现执行70秒后,在等待60秒才会进行下一次循环执行,没有实现定时执行的效果,所以和 quartz.net 联合使用,如下:
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { AutoService.Run(); }
public static class AutoService
{ public static IScheduler _scheduler; public async static void Run() { Console.WriteLine("Service Start"); if (_scheduler == null) { StdSchedulerFactory factory = new StdSchedulerFactory(); _scheduler = await factory.GetScheduler(); await _scheduler.Start(); IJobDetail job = JobBuilder.Create<XXXXJob>() .WithIdentity("job1") .Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1") .StartNow() .WithSchedule(CronScheduleBuilder.CronSchedule("0 0/1 * * * ? ")) .Build(); // Tell quartz to schedule the job using our trigger await _scheduler.ScheduleJob(job, trigger); } } }
[DisallowConcurrentExecution] public class MonitorWarningJob : IJob { public async Task Execute(IJobExecutionContext context) {} }
以上就是简单实现定时任务代码