using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers; using Timer = System.Timers.Timer; namespace Soul2.General.utils { /// /// 扩展System.Timers.Timer /// By Soul2 /// public static class TimerUtils { private const int default_loop_times = 512; /// /// 一次性计时器 /// 运行结束后自动销毁 /// /// /// /// /// public static Timer startOnce(this Timer timer, double time, Action callback) { void onElapsed(object source, ElapsedEventArgs e) { callback(timer); timer.destroy(); } return run(timer, (int)(time * 1000), false, onElapsed); } public static Timer startOnce(this Timer timer, double time, Action callback) { return timer.startOnce(time, (t) => callback?.Invoke()); } /// /// 循环计时器 /// 可以指定运行次数 /// 运行结束后自动销毁 /// /// 计时器 /// 时长 /// 次数 /// /// public static Timer startLoop(this Timer timer, double time, int times, Action callback) { int run_times = 0; void onElapsed(object source, ElapsedEventArgs e) { run_times += 1; if (run_times <= times) { callback(timer, run_times); } else { timer.destroy(); } } return run(timer, (int)(time * 1000), true, onElapsed); } public static Timer startLoop(this Timer timer, double time, int times, Action callback) { return timer.startLoop(time, times, (t, i) => callback?.Invoke(t)); } public static Timer startLoop(this Timer timer, double time, int times, Action callback) { return timer.startLoop(time, times, (t, i) => callback?.Invoke(i)); } public static Timer startLoop(this Timer timer, double time, int times, Action callback) { return timer.startLoop(time, times, (t, i) => callback?.Invoke()); } /// /// 循环计时器 /// 默认运行次数512 /// /// 计时器 /// 时长 /// 次数 /// /// public static Timer startKeep(this Timer timer, double time, Action callback, int times = default_loop_times) { int run_times = 0; void onElapsed(object source, ElapsedEventArgs e) { run_times += 1; if (run_times <= times) { callback(timer, run_times); } else { timer.destroy(); } } return run(timer, (int)(time * 1000), true, onElapsed); } public static Timer startKeep(this Timer timer, double time, Action callback, int times = default_loop_times) { return timer.startKeep(time, (t, i) => callback?.Invoke(i)); } public static Timer startKeep(this Timer timer, double time, Action callback, int times = default_loop_times) { return timer.startKeep(time, (t, i) => callback?.Invoke(t)); } public static Timer startKeep(this Timer timer, double time, Action callback, int times = default_loop_times) { return timer.startKeep(time, (t, i) => callback?.Invoke()); } public static void destroy(this Timer timer) { if (timer.Enabled) { timer.Stop(); } timer.Dispose(); } // ----------------------------------------- private static Timer run(Timer timer, int interval, bool loop, ElapsedEventHandler elapsed) { timer.Elapsed += elapsed; timer.Interval = interval; timer.AutoReset = loop; timer.Start(); return timer; } public static Timer startOnce(double time, Action callback) { return new Timer().startOnce(time, callback); } public static Timer startOnce(double time, Action callback) { return new Timer().startOnce(time, callback); } // ----------------------------------------- public static Timer startLoop(double time, int times, Action callback) { return new Timer().startLoop(time, times, callback); } public static Timer startLoop(double time, int times, Action callback) { return new Timer().startLoop(time, times, callback); } public static Timer startLoop(double time, int times, Action callback) { return new Timer().startLoop(time, times, callback); } public static Timer startLoop(double time, int times, Action callback) { return new Timer().startLoop(time, times, callback); } // ----------------------------------------- public static Timer startKeep(double time, Action callback, int times = default_loop_times) { return new Timer().startKeep(time, callback, times); } public static Timer startKeep(double time, Action callback, int times = default_loop_times) { return new Timer().startKeep(time, callback, times); } public static Timer startKeep(double time, Action callback, int times = default_loop_times) { return new Timer().startKeep(time, callback, times); } public static Timer startKeep(double time, Action callback, int times = default_loop_times) { return new Timer().startKeep(time, callback, times); } } }