diff --git a/Tools/CirculateTool/Entity/TimeTask.cs b/Tools/CirculateTool/Entity/TimeTask.cs index 8fcb68d..9e7818a 100644 --- a/Tools/CirculateTool/Entity/TimeTask.cs +++ b/Tools/CirculateTool/Entity/TimeTask.cs @@ -9,7 +9,7 @@ namespace CirculateTool.Entity; /// /// 按时执行的任务的定时类 /// -internal class TimeTask +public class TimeTask { /// /// 执行任务的时间 diff --git a/Tools/CirculateTool/StartCirculation.cs b/Tools/CirculateTool/StartCirculation.cs index d4483c5..17730ce 100644 --- a/Tools/CirculateTool/StartCirculation.cs +++ b/Tools/CirculateTool/StartCirculation.cs @@ -19,7 +19,7 @@ public class StartCirculation /// /// 指定时间执行的方法类 /// - private static List _timeTasks = []; + protected static List _timeTasks = []; /// /// 触发的异常 @@ -146,24 +146,25 @@ public class StartCirculation { if(_timeTasks.Count == 0) return; CancellationTokenSource cts = new(); - PeriodicTimer timer = new(new TimeSpan(0, 0, 0, 10, 0)); + PeriodicTimer timer = new(new TimeSpan(0, 0, 0, 1, 0)); while (await timer.WaitForNextTickAsync(cts.Token)) { string timeStr = DateTime.Now.ToString("HH:mm"); List taskList = []; - taskList.Add(Task.Factory.StartNew(() => + foreach (var task in _timeTasks) { - foreach (var task in _timeTasks) + taskList.Add(Task.Factory.StartNew(() => { if (task.ExecuteTime != timeStr) { task.IsRun = false; // 当时刻不匹配时,重置任务状态 + return; } if (task.ExecuteTime == timeStr && !task.IsRun) // 当时间匹配且任务未执行时,执行任务 { try { - task.Action?.Invoke(); + task.Action!(); task.IsRun = true; } catch (Exception ex) @@ -171,8 +172,8 @@ public class StartCirculation ExceptionHandler?.Invoke(task.Description ?? task.Action!.Method.Name, ex); } } - } - })); + })); + } Task.WaitAll([.. taskList]); } } diff --git a/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs b/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs index 601e7e2..11128bf 100644 --- a/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs +++ b/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs @@ -14,8 +14,8 @@ public class DataClear(ClearData clearData) /// 定时清理无用数据, ---- 每隔10分钟清理一次 /// /// - [Circulation("数据清理", 1000 * 60 * 30)] - public bool ClearDataCirculate() + [CirculationTime(["10:11","10:12"], "数据清理")] + public void ClearDataCirculate() { try { @@ -56,10 +56,6 @@ public class DataClear(ClearData clearData) { ConsoleLog.Exception($"【数据清理】线程发生异常,异常信息:{ex}"); } - - - - return true; } } \ No newline at end of file diff --git a/WcsMain/Plugins/WcsCirculation.cs b/WcsMain/Plugins/WcsCirculation.cs index 6036563..960ec7d 100644 --- a/WcsMain/Plugins/WcsCirculation.cs +++ b/WcsMain/Plugins/WcsCirculation.cs @@ -22,14 +22,37 @@ public class WcsCirculation(IComponentContext componentContext) : StartCirculati var attributes = method.GetCustomAttributes(false); foreach (var attribute in attributes) { - if (attribute is not CirculationAttribute needDurable) continue; - string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}"; - instance ??= CreateInstance(type); - bool Action() => (bool)(method.Invoke(instance, []) ?? false); - StartTask(Action, methodDescription, needDurable.CirculationTime); - break; + if (attribute == default) continue; + /* 定时执行的任务 */ + if (attribute is CirculationAttribute needDurable) + { + string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}"; + instance ??= CreateInstance(type); + bool Action() => (bool)(method.Invoke(instance, []) ?? false); + StartTask(Action, methodDescription, needDurable.CirculationTime); + break; + } + /* 每天指定时间执行 */ + if (attribute is CirculationTimeAttribute timeCirculate) + { + string methodDescription = timeCirculate.MethodDescription ?? $"{type.Name}.{method.Name}"; + instance ??= CreateInstance(type); + foreach (var time in timeCirculate.Times) + { + _timeTasks.Add(new CirculateTool.Entity.TimeTask + { + ExecuteTime = time, + Action = new Action(() => method.Invoke(instance, [])), + Description = methodDescription, + IsRun = false + }); + } + } + /* END */ } } + /* 执行按时执行的任务 ---- 方法内判断,若没有此类方法则不会执行 */ + StartTimeTask(); }