石英调度程序根据重复触发完成作业的事件

问题描述

我有一个基于间隔时间的 quatz 计划作业,并重复“N”次。 完成所有预定的“N”个作业后,我想在最后打印报告。 因为调度程序异步执行,在作业完成之前打印最终报告。

1.) 无论如何,我们是否可以等待所有作业完成,然后根据事件处理程序打印我的最终报告?

2.) 在我的场景中,我们应该等待计划结束事件还是所有作业完成事件?

下面是我的调度器初始化

         public async void Scheduler()
        {
            interval = Convert.ToInt32(Environment.GetEnvironmentVariable("pt_interval"));
            Console.WriteLine($"scheduled interval in seconds: {interval}");
            repeatations = Convert.ToInt32(Environment.GetEnvironmentVariable("pt_repeatCount"));
            Console.WriteLine($"n.o of repeatations set to {repeatations}");

            StdSchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = await factory.GetScheduler();

            await scheduler.Start();

            IJobDetail job = JobBuilder.Create<Schedule>()
                .WithIdentity($"Job_Create",$"read_userid")          
                .Build();
                
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity($"Job_Trigger",$"read_userid")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(interval)
                    .WithRepeatCount(repeatations))           
                .Build();

            await scheduler.ScheduleJob(job,trigger);
        }

IJob Scheduler 类

        public class Schedule : IJob,ISchedulerListener
        {
            Schedule mySchedule = new Schedule();
            public async Task Execute(IJobExecutionContext context)
            {
                 await ScheduleStart();       
            }
        }

计划开始()

        public async static Task ScheduleStart()
        {
            string display = $"\nrepeatation count: {count++}\n";
            long SumOfInterval = 0;
            StringBuilder sb = new StringBuilder();

            foreach (var userid in userid_list)
            {
                DateTime datetime = DateTime.Now;
                var val = map.get(userid);
                DateTime datetime2 = DateTime.Now;

                var d1 = datetime.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff");
                var d2 = datetime2.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff");
                TimeSpan diff = datetime2 - datetime;
                if (diff.TotalSeconds < 0)
                {
                    diff = diff + TimeSpan.FromMilliseconds(1);
                }

                maxTime.Add(diff);
                SumOfInterval = SumOfInterval + Convert.ToInt64(diff.Seconds);
                sb.Append($"userid: {userid},value: {Encoding.UTF8.GetString(val)},start: {d1},end: {d2},diff: {diff}\n");
            }

            avgTime = SumOfInterval / userid_list.Length;
            TotalSum = TotalSum + SumOfInterval;

            sb.Append($"avg time for the interval is {avgTime}");

            Console.WriteLine($"\n{display}\n{sb}");

            //i want below logic to be executed after the end of all jobs being completed
            if (count == repeatations)
            {
                string content = $"avg time taken: {TotalSum / (userid_list.Length * repeatations)}\n" +
                $"max time taken: {maxTime.Max()}\n";
                Console.WriteLine(content);
                File.WriteAllText(file,content);
            }
        }

我希望在所有作业完成后执行以下逻辑

            if (count == repeatations)
            {
                string content = $"avg time taken: {TotalSum / (userid_list.Length * repeatations)}\n" +
                $"max time taken: {maxTime.Max()}\n";
                Console.WriteLine(content);
                File.WriteAllText(file,content);
            }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)