using System.Diagnostics; using System.Reflection; using MegghysAPI.Attributes; namespace MegghysAPI.Core { public static class TimerManager { private static Dictionary timers = new(); private static long time = 0; [AutoInit(Order = 100)] public static void RegisterAll() { System.Timers.Timer temp = new() { Interval = 1000, AutoReset = true, }; temp.Elapsed += (_, _) => { if (time != 0) timers.Where(timer => time % timer.Value.Time == 0) .ForEach(timer => { Task.Run(() => { var sw = new Stopwatch(); sw.Start(); timer.Key.Invoke(null, null); sw.Stop(); if (timer.Value.Log) Logs.Text($"[{sw.ElapsedMilliseconds} ms] [{timer.Key.DeclaringType.Name}.{timer.Key.Name}] 计时器触发 [{timer.Value.Time}-{time}]"); }); }); time++; }; AppDomain.CurrentDomain.GetAssemblies() .ForEach(a => a.GetTypes().Where(t => t.IsClass).ForEach(t => t.GetMethods().Where(m => m.GetCustomAttributes(true).FirstOrDefault(a => a is AutoTimerAttribute) != null) .ForEach(m => { var attr = m.GetCustomAttributes(true).FirstOrDefault(a => a is AutoTimerAttribute) as AutoTimerAttribute; timers.Add(m, attr); Logs.Info($"注册自动计时器 {m.DeclaringType.Name}.{m.Name} <{attr.Time} s>"); }))); temp.Start(); timers.Where(timer => timer.Value.CallOnRegister).ForEach(timer => Task.Run(() => timer.Key.Invoke(null, null))); } } }