石英作业没有Task.Delay不能执行



这是我的工作:

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");
}
}

可以在这里找到更好的解决方案

最新更新