//проверяет, нужно ли запускать задачу исходя из времени последнего запуска и периодичности private bool PeriodFitting(SavedTaskResults task, string taskPeriod) { DateTime taskCutDT = this.CutDateTime(task.lastRun, taskPeriod); DateTime nowCutDT = this.CutDateTime(GlobalUtils.GetNowUtcDateTime(), taskPeriod); return(taskCutDT == nowCutDT); }
//сохраняем результаты текущей задачи в списке результатов public virtual void SaveTaskResult(int _id, bool _isSuccess, DateTime _whenItStarted) { SavedTaskResults workRes = prevRes.Find(x => x.id == _id); //если в предыдущей строке задача нашлась, она затерается новой if (workRes != null) { resToSave.Remove(workRes); } workRes = new SavedTaskResults(); workRes.id = _id; workRes.isSuccess = _isSuccess; workRes.lastRun = _whenItStarted; resToSave.Add(workRes); }
private void Init() { string[] sepFields = new string[] { " " }; string[] sepDate = new string[] { "." }; string[] sepTime = new string[] { ":" }; StreamReader myStream = null; try { myStream = new StreamReader(this.lastLogPath); } catch (Exception ex) { this.checkStatus = false; ControllerOfOutput coo = ControllerOfOutput.Instance; coo.WriteErrors("Ошибка при попытке открыть файл логов работы. Текст ошибки" + ex.Message); return; } while (!myStream.EndOfStream) { string strToParse = myStream.ReadLine(); string[] parsingStr = strToParse.Split(sepFields, StringSplitOptions.RemoveEmptyEntries); try { List <int> parsingStrDate = StrArrToIntArr(parsingStr[1].Split(sepDate, StringSplitOptions.RemoveEmptyEntries)); List <int> parsingStrTime = StrArrToIntArr(parsingStr[2].Split(sepTime, StringSplitOptions.RemoveEmptyEntries)); SavedTaskResults tmpTsk = new SavedTaskResults(); tmpTsk.id = int.Parse(parsingStr[0]); tmpTsk.lastRun = new DateTime(parsingStrDate[2], parsingStrDate[1], parsingStrDate[0], parsingStrTime[0], parsingStrTime[1], parsingStrTime[2]); tmpTsk.isSuccess = bool.Parse(parsingStr[3]); this.prevRes.Add(tmpTsk); } catch (Exception) { continue; } } myStream.Close(); this.checkStatus = true; }
//Проверка задания на тему того, надо ли запускать ее еще раз //false, если задачу надо запустить еще раз public virtual bool CheckTaskExecute(int taskID, string taskPeriod) { ControllerOfOutput output = ControllerOfOutput.Instance; //находим нужное задание по id SavedTaskResults workRes = prevRes.Find(x => x.id == taskID); if (workRes == null) { output.WriteAverageMessage("Задание " + taskID + " отсутствует в списке. Начинаем выполнение."); return(false); } //исключительная ситуация, требующая дополнительного внимания: когда задание выполнилось, //затем пропало из планировщика, затем снова появилось в планировщике. //оно будет выполнено еще раз, как и задания с изменившимся id //добавление этого таска нужно чтобы переносить уже сделанные задачи на следующую проверку resToSave.Add(workRes); if (!workRes.isSuccess) { output.WriteAverageMessage("Предыдущее выполнение задания " + taskID + " завершилось ошибкой. Начинаем выполнение."); return(false); } bool periodRes = PeriodFitting(workRes, taskPeriod); if (periodRes) { output.WriteAverageMessage("Задача " + taskID + " уже успешно выполнялась в периоде " + taskPeriod + ". Последнее время выполнения: " + workRes.lastRun.ToString() + "."); } else { output.WriteAverageMessage("Задача " + taskID + " будет выполнена."); } return(periodRes); }