/// <summary> /// Вычисление следующего времени исполнения /// </summary> /// <param name="sett">Параметры шедулера</param> /// <returns>Дата следующего исполнения</returns> protected static DateTime GetNextTime(SchedularSettings sett) { TimeSpan _start = sett.StartTime; TimeSpan _end = sett.EndTime; TimeSpan _interval = sett.Interval; if (_interval == default(TimeSpan)) return default(DateTime); if (DateTime.Now.TimeOfDay > _end) { return DateTime.Now.Date + _start + new TimeSpan(24, 0, 0); } else { if (DateTime.Now.TimeOfDay < _start) { return DateTime.Now.Date + _start; } else { for (TimeSpan inv = _start; inv <= _end; inv += _interval) if (DateTime.Now.TimeOfDay <= inv) { return DateTime.Now.Date + inv; } return DateTime.Now.Date + _start + new TimeSpan(24, 0, 0); } } }
/// <summary> /// Создать экземпляр планировщика /// </summary> /// <param name="sett">Настройки</param> /// <param name="action">Действие</param> /// <param name="Executor">Менеджер исполнения</param> protected MySchedular(SchedularSettings sett, Action action, IExecutor Executor = null) { this.sett = sett; executor = Executor ?? new Executor(); this.action = action; if (sett.Interval != default(TimeSpan)) new Thread(DoWork) { IsBackground = true }.Start(); }
/// <summary> /// Загрузка настроек из базы /// </summary> /// <param name="SchedularName">Имя планировщика</param> /// <returns>Набор параметров для запуска планирования</returns> protected static SchedularSettings LoadSettings(string SchedularName) { Log.Debug("Загрузка настроек для " + SchedularName); try { SchedularSettings settings = new SchedularSettings(); string ConnectionString = ConfigurationManager.ConnectionStrings["dbsync"].ConnectionString; using (SqlConnection conn = new SqlConnection(ConnectionString)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = string.Format(@"Select TOP 1 [SchedularName] ,[StartDate] ,[EndDate] ,[Interval] ,[IsEnabled] from SchedularSettings where [SchedularName] = '{0}'", SchedularName); using (SqlDataReader reader = cmd.ExecuteReader()) { try { if (!reader.Read()) return settings; settings.StartTime = TimeSpan.Parse(reader["StartDate"].ToString()); settings.SchedularName = reader["SchedularName"].ToString(); settings.EndTime = TimeSpan.Parse(reader["EndDate"].ToString()); settings.Interval = TimeSpan.Parse(reader["Interval"].ToString()); settings.IsEnabled = bool.Parse(reader["IsEnabled"].ToString()); } catch (Exception Ex) { Log.Error("Не удалось разобрать значение настройки из базы " + reader["vs"].ToString(), Ex); } } } } return settings; } catch (Exception ex) { Log.Error("Не удалось загрузить настройки из базы ", ex); } return null; }