private static void JobIsDone(IAsyncResult asyncResult) { Tuple <Guid, Action, DateTime> args = asyncResult.AsyncState as Tuple <Guid, Action, DateTime>; ScheduleJob job = DataService.PerThread.ScheduleJobSet.SingleOrDefault(x => x.Id == args.Item1); Action executeTask = args.Item2; DateTime executedTime = args.Item3; DateTime endTime = DateTime.Now; ScheduleTaskState taskState = ScheduleTaskState.Success; Exception exception = null; StringBuilder info = new StringBuilder(); try { _log.Write("Начинается Асинхронное выполнение таска джобы " + job.Id); executeTask.EndInvoke(asyncResult); } catch (Exception e) { exception = e; _log.Write(e, "Выполнение джобы " + job.Id + " ПРЕРВАНО, возникла системная ОШИБКА"); taskState = ScheduleTaskState.EpicFail; } finally { if (exception != null) { info.AppendLine(exception.Message); while (exception.InnerException != null) { exception = exception.InnerException; } _log.Write(exception, "Выполнение джобы " + job.Id + " завершено с ошибкой"); info.AppendLine("InnerException: " + exception.Message); job.State = (byte)JobState.Error; } else { _log.Write("Выполнение джобы " + job.Id + " завершено успешно"); if (job.DoRepeat && job.RepeatPeriod.HasValue) { job.State = (byte)JobState.ReadyToStart; var d = DateTime.Now.AddSeconds(job.RepeatPeriod.Value); job.NextExecutionDate = d; _log.Write("Следующее выполнение джобы назначено на " + d); } else { job.State = (byte)JobState.Ended; } } ReSaveJobToDb(job); Log(job, executedTime, endTime, info.ToString(), taskState); } }
private static void Log(ScheduleJob scheduleJob, DateTime startDate, DateTime endDate, string info, ScheduleTaskState state) { ScheduleExecutionInfo log = new ScheduleExecutionInfo() { StartDate = startDate, EndDate = endDate, ScheduleJobId = scheduleJob.Id, Info = info, State = (byte)state }; DataService.PerThread.ScheduleExecutionInfoSet.AddObject(log); DataService.PerThread.SaveChanges(); }