【发布时间】:2021-10-26 02:44:27
【问题描述】:
这是我的工作:
public class MyJob: IJob
{
public static bool run = true;
public Task Execute(IJobExecutionContext context)
{
logger.Info("Start MyJob");
}
}
这是我的课程:
private static ILogger logger = LogManager.GetCurrentClassLogger();
private static IJob MyJob;
static void Main(string[] args)
{
try
{
logger.Info("Start");
RunProgram().GetAwaiter().GetResult();
logger.Info("Completed");
}
catch (Exception ex)
{
logger.Error($"error");
}
}
private static async Task RunProgram()
{
try
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
await Task.Delay(TimeSpan.FromSeconds(10));
await scheduler.Shutdown();
}
catch (SchedulerException se)
{
await Console.Error.WriteLineAsync(se.ToString());
}
}
上面的代码正在运行。
触发器集 MyJob 每 5 秒运行一次。 Task.Delay() 使程序在 10 秒后终止。 所以 MyJob 会被执行两次。
我想等到工作完成而不是设置计时器,所以我阅读了石英教程并像这样修改 RunProgram():
private static async Task RunProgram()
{
try
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start(); //++
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
await scheduler.ScheduleJob(job, trigger);
//--await scheduler.Start();
//--await Task.Delay(TimeSpan.FromSeconds(10))
//--await scheduler.Shutdown();
}
catch (SchedulerException se)
{
await Console.Error.WriteLineAsync(se.ToString());
}
}
那么 MyJob 永远不会被执行。
有什么问题吗?
【问题讨论】:
标签: c# quartz-scheduler quartz.net quartz