Кварцевое задание не выполняется без задачи.Задержка

#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 секунд. Проблема в том, что я даже не могу уволить свою работу со второй версией моей программы запуска().