/// <summary> /// 创建计时器实例 /// </summary> /// <param name="dueTime">调用 Elapsed 之前延迟的时间量,指定 -1 毫秒以防止启动计时器。指定零 (0) 可立即启动计时器。</param> /// <param name="interval">调用 Elapsed 的时间间隔,指定-1毫秒可以禁止触发事件Elapsed</param> /// <param name="arg">传递给Elapsed事件的参数</param> /// <param name="containerOwner">管理计时器的容器,null引用意味着在当前线程触发此计时器。默认值为null</param> public Timer(TimeSpan dueTime, TimeSpan interval, object arg, ITimerContainerOwner containerOwner = null) { this.containerOwner = containerOwner; if (containerOwner != null && containerOwner.TimerContainer != null) containerOwner.TimerContainer.AddTimer(this); else dispatcher = Dispatcher.CurrentDispatcher; timer = new System.Threading.Timer(timerCallback, arg, dueTime, interval); }
/// <summary> /// 创建一个计时器,在每天的某个时间点触发事件Elapsed /// </summary> /// <param name="hour">指定的时间点,取值范围0到23</param> /// <param name="arg">传递给事件Elapsed的参数</param> /// <param name="containerOwner">管理计时器的容器,null引用意味着在当前线程触发此计时器。默认值为null</param> /// <returns>一个计时器,在每天的由参数hour指定的时间点触发事件Elapsed</returns> public static Timer CreateByHourInEveryDay(float hour, object arg, ITimerContainerOwner containerOwner = null) { if (hour < 0.0f || hour >= 24.0f) throw new ArgumentOutOfRangeException("hour", "参数hour必须在0到24之间(不包括24)"); var now = DateTime.Now; DateTime nextElapsedTime = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0) + TimeSpan.FromHours(hour); TimeSpan intervalTimeSpan; if (now <= nextElapsedTime) // 如果当前时间还没到当天的这个时间点,直接减就是间隔了,否则要用转天的时间来减 intervalTimeSpan = nextElapsedTime - now; else intervalTimeSpan = nextElapsedTime + TimeSpan.FromDays(1) - now; return new Timer(intervalTimeSpan, TimeSpan.FromDays(1), arg, containerOwner); }
/// <summary> /// 创建计时器实例 /// </summary> /// <param name="dueTime">调用 Elapsed 之前延迟的时间量(以毫秒为单位)</param> /// <param name="interval">调用 Elapsed 的时间间隔(以毫秒为单位),指定 System.Threading.Timeout.Infinite(等价与-1)可以禁止触发事件Elapsed</param> /// <param name="arg">传递给Elapsed事件的参数</param> /// <param name="containerOwner">管理计时器的容器,null引用意味着在当前线程触发此计时器。默认值为null</param> public Timer(long dueTime, long interval, object arg, ITimerContainerOwner containerOwner = null) : this(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(interval), arg, containerOwner) { }
public static Timer CreateInvokeOnce(TimeSpan dueTime, object arg, ITimerContainerOwner containerOwner = null) { return new Timer(dueTime, TimeSpan.FromMilliseconds(Timeout.Infinite), arg, containerOwner); }
public static Timer CreateInvokeOnce(long dueTime, object arg, ITimerContainerOwner containerOwner = null) { return new Timer(dueTime, Timeout.Infinite, arg, containerOwner); }
/// <summary> /// 创建一个计时器,在某一时间为起始,每经过一个时间间隔触发事件Elapsed /// </summary> /// <param name="startTime">起始时间</param> /// <param name="interval">时间间隔</param> /// <param name="arg">传递给事件Elapsed的参数</param> /// <param name="containerOwner">管理计时器的容器,null引用意味着在当前线程触发此计时器。默认值为null</param> /// <returns>一个计时器,在参数startTime指定的起始时间每经过由参数interval指定的时间间隔后触发事件Elapsed</returns> public static Timer CreateByStartTimeAndInterval(DateTime startTime, TimeSpan interval, object arg, ITimerContainerOwner containerOwner = null) { DateTime now = DateTime.Now; long chushu = (long)((now - startTime).TotalMilliseconds / interval.TotalMilliseconds); DateTime nextElapsedTime = startTime + TimeSpan.FromMilliseconds((chushu + 1) * interval.TotalMilliseconds); return new Timer(nextElapsedTime - now, interval, arg, containerOwner); }