<fix>[important]修复按时间执行的任务的定时器BUG
This commit is contained in:
parent
e86cc463e1
commit
a36b6451fb
|
|
@ -9,7 +9,7 @@ namespace CirculateTool.Entity;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 按时执行的任务的定时类
|
/// 按时执行的任务的定时类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class TimeTask
|
public class TimeTask
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 执行任务的时间
|
/// 执行任务的时间
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user