private void Work(StopClass stopped) { while (!stopped.Value) { var now = DateTime.Now; foreach (var plan in Plan) { try { lock (plan.Lock) { if (plan.NextTime <= now && plan.Executed == false) { plan.Executed = true; var startInfo = new ProcessStartInfo(Section.ExecutorPath, plan.Job.JobId); startInfo.CreateNoWindow = true; startInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory; startInfo.UseShellExecute = true; var process = Process.Start(startInfo); plan.LastRunTime = DateTime.Now; } } } catch (Exception ex) { Trace.WriteLine($"Time:{DateTime.Now};{ex}"); } } //Waitor.SpinOnce(); Thread.Sleep(1); } }
private void RefreshPlan(StopClass stopped) { while (!stopped.Value) { var now = DateTime.Now; foreach (var item in Plan) { lock (item.Lock) { if (item.Executed) { var cron = CrontabSchedule.Parse(item.Job.Cron, new CrontabSchedule.ParseOptions() { IncludingSeconds = true }); var nextTime = cron.GetNextOccurrence(now); if (nextTime - item.LastRunTime >= TimeSpan.FromSeconds(1)) //avoid the status being refreshed immediately as the Plan is quickly executed. { item.NextTime = nextTime; item.Executed = false; } } } } //Waitor.SpinOnce(); Thread.Sleep(1); } }