#c# #quartz-scheduler #quartz.net #quartz
Вопрос:
Это моя работа:
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());
}
}
Приведенный выше код работает.
Триггер запускает мою работу каждые 5 секунд. Задача.Задержка() заставит программу завершиться через 10 секунд. Так что моя работа будет выполнена дважды.
Я хочу дождаться завершения задания вместо установки таймера, поэтому я прочитал учебник quartz и изменил 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());
}
}
Тогда моя работа никогда не будет выполнена.
Что-то не так?
Ответ №1:
Привет, можете ли вы попробовать удалить StartNow(). из кода ниже
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
Кроме того, попробуйте использовать триггер crone, как упомянуто здесь.
Комментарии:
1. Спасибо вам за ваш ответ. Я пытаюсь удалить StartNow (), но ничего не происходит. А кронтригер даже не работает с моим исходным кодом.
Ответ №2:
Просто добавьте консоль.ReadLine() в вашем основном методе. Это предотвратит прекращение действия вашей заявки.
static void Main(string[] args)
{
try
{
logger.Info("Start");
RunProgram().GetAwaiter().GetResult();
logger.Info("Completed");
Console.ReadLine();
}
catch (Exception ex)
{
logger.Error($"error");
}
}
Лучшее решение можно найти здесь
Комментарии:
1. Спасибо вам за ваш ответ. Это все равно не может помешать прекращению работы
2. С помощью этого решения и второй версии вашей программы запуска () задание выполняется каждые 5 секунд с моей стороны. Я полагаю, что вы спрашиваете о чем-то другом. Может быть, ваша работа занимает больше 5 секунд? Пожалуйста, уточните.
3. Да, моя работа занимает больше 5 секунд. Проблема в том, что я даже не могу уволить свою работу со второй версией моей программы запуска().