新建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) {} }
以上就是簡單實現定時任務代碼