private void StartTimeList(CycelType cycelType, List <DateTime> times) { if (times == null || times.Count == 0) { return; } InitTimeList(cycelType, times); //将日期根据循环模式做处理 var ts = GetNextTime(cycelType, times); if (ts == TimeSpan.MinValue) { return; } _timer = new Timer((obj) => { var timeSpan = GetNextTime(cycelType, times); if (timeSpan != TimeSpan.MinValue) { _timer.Change(timeSpan, timeSpan); } _action(); if (timeSpan == TimeSpan.MinValue) { try { Stop(); } catch { } } }, null, ts, ts); }
/// <summary> /// 创建一个定时器对象并立即开始 /// </summary> /// <param name="action">定时器要完成的任务委托</param> /// <param name="cycelType">循环模式<see cref="CycelType"/></param> /// <param name="times">时间列表</param> public static Timing StartNewTiming(Action action, CycelType cycelType, params DateTime[] times) { var timing = new Timing(action); timing.Start(cycelType, times); return(timing); }
private DateTime HandleTime(CycelType cycel, DateTime dt) { switch (cycel) { case CycelType.Never: return(dt); case CycelType.Minute: return(dt.AddMinutes(1)); case CycelType.Hour: return(dt.AddHours(1)); case CycelType.Day: return(dt.AddDays(1)); case CycelType.Week: return(dt.AddDays(7)); case CycelType.Month: return(dt.AddMonths(1)); case CycelType.Year: return(dt.AddYears(1)); default: return(dt); } }
private TimeSpan GetNextTime(CycelType cycelType, List <DateTime> times) { var next = times.OrderBy(t => t) .Where(t => t > DateTime.Now) .Select(t => new { Index = times.IndexOf(t), Time = t }) .FirstOrDefault(); if (next == null) { return(TimeSpan.MinValue); } DateTime nextTime = next.Time; if (nextTime == DateTime.MinValue) { return(TimeSpan.MinValue); } var ts = (nextTime - DateTime.Now); if (ts.TotalMilliseconds <= 0) { return(TimeSpan.MinValue); } else { times[next.Index] = HandleTime(cycelType, nextTime); return(ts); } }
private void InitTimeList(CycelType cycel, List <DateTime> times) { for (int i = 0; i < times.Count; i++) { switch (cycel) { case CycelType.Never: break; case CycelType.Minute: times[i] = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:") + times[i].ToString("ss.fff")); break; case CycelType.Hour: times[i] = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:") + times[i].ToString("mm:ss.fff")); break; case CycelType.Day: times[i] = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd ") + times[i].ToString("HH:mm:ss.fff")); break; case CycelType.Week: times[i] = DateTime.Parse(DateTime.Now.ToString("yyyy-MM- ") + times[i].ToString("dd HH:mm:ss.fff")); break; case CycelType.Month: times[i] = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-") + times[i].ToString("dd HH:mm:ss.fff")); break; case CycelType.Year: times[i] = DateTime.Parse(DateTime.Now.ToString("yyyy-") + times[i].ToString("MM-dd HH:mm:ss.fff")); break; default: break; } } while (cycel != CycelType.Never && times.Any(t => t < DateTime.Now)) { var leftList = times.Where(t => t < DateTime.Now).ToList(); for (int i = 0; i < leftList.Count; i++) { times[i] = HandleTime(cycel, times[i]); } } }
/// <summary> /// 开始定时器 /// </summary> /// <param name="cycelType">循环模式<see cref="CycelType"/></param> /// <param name="times">时间列表</param> public void Start(CycelType cycelType, params DateTime[] times) { StartTimeList(cycelType, times.ToList()); }