/// <summary> /// 构造函数 /// </summary> /// <param name="tr">配置字符串</param> /// <param name="e">提醒回调函数</param> public TimedRemind(string tr, DelegateTimedDone e = null) { string[] arr = tr.Split(new char[1] { '|' }); if (arr.Length > 5) { try { TimedMode = (EnmuTimedMode)Enum.Parse(typeof(EnmuTimedMode), arr[0], true); TimeLoop = (EnmuTimeLoop)Enum.Parse(typeof(EnmuTimeLoop), arr[1], true); TimeDate = Convert.ToDateTime(arr[2]); Mark = arr[3]; DateTime dtStart = Convert.ToDateTime(arr[4]); DateTime dtEnd = Convert.ToDateTime(arr[5]); Status = EnmuTimedStatus.Ready; if (e != null) { BindTimedDone(e); } Start(dtStart, dtEnd); } catch (Exception err) { Console.WriteLine(err.Message); Status = EnmuTimedStatus.Done; } } else { Status = EnmuTimedStatus.Done; } }
/// <summary> /// 构造函数 /// </summary> /// <param name="dt">时间</param> /// <param name="tm">定时模式</param> /// <param name="tl">定时条件</param> /// <param name="mark">备注</param> public TimedRemind(DateTime dt, EnmuTimedMode tm = EnmuTimedMode.Timekeep, EnmuTimeLoop tl = EnmuTimeLoop.One, String mark = "") { TimeDate = dt; TimedMode = tm; TimeLoop = tl; Mark = mark; Status = EnmuTimedStatus.Ready; }
/// <summary> /// 停止定时 /// </summary> public void Stop() { Status = EnmuTimedStatus.Done; }
/// <summary> /// 指定时间开始定时 /// </summary> /// <param name="dtStart">开始时间</param> /// <param name="dtEnd">结束时间</param> /// <returns></returns> public bool Start(DateTime dtStart, DateTime dtEnd) { DateTime now = DateTime.Now; int delayTime = GetDelayTime(TimeDate, TimedMode); if (now > dtEnd) { if (TimeLoop == EnmuTimeLoop.More) { if (TimedMode == EnmuTimedMode.Timekeep) { while (dtEnd <= now) { dtStart = dtStart.AddSeconds(delayTime); dtEnd = dtEnd.AddSeconds(delayTime); } } else { dtStart = now; dtEnd = new DateTime(dtStart.Year, dtStart.Month, dtStart.Day, TimeDate.Hour, TimeDate.Minute, TimeDate.Second); while (dtEnd <= dtStart) { dtEnd = dtEnd.AddDays(1); } } } else { Status = EnmuTimedStatus.Done; return(false); } } StartTime = dtStart; EndTime = dtEnd; if (EndTime <= DateTime.Now) { Status = EnmuTimedStatus.Done; return(false); } Status = EnmuTimedStatus.Run; TimedThread = new Thread(() => { while (Status != EnmuTimedStatus.Done) { while (EndTime >= DateTime.Now) { if (Status == EnmuTimedStatus.Done) { return; } Thread.Sleep(1000); } if (TimeLoop == EnmuTimeLoop.One) { Status = EnmuTimedStatus.Done; } if (TimeLoop == EnmuTimeLoop.More) { if (TimedMode == EnmuTimedMode.Timed) { StartTime = StartTime.AddDays(1); EndTime = EndTime.AddDays(1); } else { StartTime = DateTime.Now; EndTime = GetEndTime(TimeDate, StartTime); } } EventTimedDone?.Invoke(this); } }); TimedThread.Start(); return(true); }