这是我的工作:
public class MyJob: IJob
{
public static bool run = true;
public Task Execute(IJobExecutionContext context)
{
logger.Info("Start MyJob");
}
}
下面是我的class Program:
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永远不会被执行。
有什么问题吗?
嗨,你可以尝试删除StartNow()。从下面代码
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
另外,请尝试使用此处提到的crone触发器。
只需在Main方法中添加Console.ReadLine()。这将防止你的应用程序被终止。
static void Main(string[] args)
{
try
{
logger.Info("Start");
RunProgram().GetAwaiter().GetResult();
logger.Info("Completed");
Console.ReadLine();
}
catch (Exception ex)
{
logger.Error($"error");
}
}
可以在这里找到更好的解决方案