<fix>[important]修复按时间执行的任务的定时器BUG

This commit is contained in:
葛林强 2024-06-21 10:14:13 +08:00
parent e86cc463e1
commit a36b6451fb
4 changed files with 40 additions and 20 deletions

View File

@ -9,7 +9,7 @@ namespace CirculateTool.Entity;
/// <summary> /// <summary>
/// 按时执行的任务的定时类 /// 按时执行的任务的定时类
/// </summary> /// </summary>
internal class TimeTask public class TimeTask
{ {
/// <summary> /// <summary>
/// 执行任务的时间 /// 执行任务的时间

View File

@ -19,7 +19,7 @@ public class StartCirculation
/// <summary> /// <summary>
/// 指定时间执行的方法类 /// 指定时间执行的方法类
/// </summary> /// </summary>
private static List<TimeTask> _timeTasks = []; protected static List<TimeTask> _timeTasks = [];
/// <summary> /// <summary>
/// 触发的异常 /// 触发的异常
@ -146,24 +146,25 @@ public class StartCirculation
{ {
if(_timeTasks.Count == 0) return; if(_timeTasks.Count == 0) return;
CancellationTokenSource cts = new(); 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)) while (await timer.WaitForNextTickAsync(cts.Token))
{ {
string timeStr = DateTime.Now.ToString("HH:mm"); string timeStr = DateTime.Now.ToString("HH:mm");
List<Task> taskList = []; List<Task> 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) if (task.ExecuteTime != timeStr)
{ {
task.IsRun = false; // 当时刻不匹配时,重置任务状态 task.IsRun = false; // 当时刻不匹配时,重置任务状态
return;
} }
if (task.ExecuteTime == timeStr && !task.IsRun) // 当时间匹配且任务未执行时,执行任务 if (task.ExecuteTime == timeStr && !task.IsRun) // 当时间匹配且任务未执行时,执行任务
{ {
try try
{ {
task.Action?.Invoke(); task.Action!();
task.IsRun = true; task.IsRun = true;
} }
catch (Exception ex) catch (Exception ex)
@ -171,8 +172,8 @@ public class StartCirculation
ExceptionHandler?.Invoke(task.Description ?? task.Action!.Method.Name, ex); ExceptionHandler?.Invoke(task.Description ?? task.Action!.Method.Name, ex);
} }
} }
} }));
})); }
Task.WaitAll([.. taskList]); Task.WaitAll([.. taskList]);
} }
} }

View File

@ -14,8 +14,8 @@ public class DataClear(ClearData clearData)
/// 定时清理无用数据, ---- 每隔10分钟清理一次 /// 定时清理无用数据, ---- 每隔10分钟清理一次
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[Circulation("数据清理", 1000 * 60 * 30)] [CirculationTime(["10:11","10:12"], "数据清理")]
public bool ClearDataCirculate() public void ClearDataCirculate()
{ {
try try
{ {
@ -56,10 +56,6 @@ public class DataClear(ClearData clearData)
{ {
ConsoleLog.Exception($"【数据清理】线程发生异常,异常信息:{ex}"); ConsoleLog.Exception($"【数据清理】线程发生异常,异常信息:{ex}");
} }
return true;
} }
} }

View File

@ -22,14 +22,37 @@ public class WcsCirculation(IComponentContext componentContext) : StartCirculati
var attributes = method.GetCustomAttributes(false); var attributes = method.GetCustomAttributes(false);
foreach (var attribute in attributes) foreach (var attribute in attributes)
{ {
if (attribute is not CirculationAttribute needDurable) continue; if (attribute == default) continue;
string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}"; /* 定时执行的任务 */
instance ??= CreateInstance(type); if (attribute is CirculationAttribute needDurable)
bool Action() => (bool)(method.Invoke(instance, []) ?? false); {
StartTask(Action, methodDescription, needDurable.CirculationTime); string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}";
break; 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();
} }