问题描述
我有一个基于间隔时间的 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 (将#修改为@)