Example #1
0
        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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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]);
                }
            }
        }
Example #6
0
 /// <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());
 }