Fix Worker-Cycle:

Periodic set last execution,
Print Running Worker-Names when done
This commit is contained in:
2025-07-03 22:48:06 +02:00
parent e8d612557f
commit 9743bb6e8e
3 changed files with 9 additions and 3 deletions

View File

@ -91,7 +91,7 @@ public static class Tranga
foreach (BaseWorker baseWorker in AllWorkers.DueWorkers()) foreach (BaseWorker baseWorker in AllWorkers.DueWorkers())
StartWorkers.Add(baseWorker); StartWorkers.Add(baseWorker);
foreach (BaseWorker worker in StartWorkers) foreach (BaseWorker worker in StartWorkers.ToArray())
{ {
if(RunningWorkers.ContainsKey(worker)) if(RunningWorkers.ContainsKey(worker))
continue; continue;
@ -109,6 +109,8 @@ public static class Tranga
RunningWorkers.Add(libraryContextWorker, libraryContextWorker.DoWork()); RunningWorkers.Add(libraryContextWorker, libraryContextWorker.DoWork());
}else }else
RunningWorkers.Add(worker, worker.DoWork()); RunningWorkers.Add(worker, worker.DoWork());
StartWorkers.Remove(worker);
} }
Thread.Sleep(Settings.WorkCycleTimeoutMs); Thread.Sleep(Settings.WorkCycleTimeoutMs);
} }
@ -117,8 +119,10 @@ public static class Tranga
private static void CheckRunningWorkers() private static void CheckRunningWorkers()
{ {
KeyValuePair<BaseWorker, Task<BaseWorker[]>>[] done = RunningWorkers.Where(kv => kv.Value.IsCompleted).ToArray(); KeyValuePair<BaseWorker, Task<BaseWorker[]>>[] done = RunningWorkers.Where(kv => kv.Value.IsCompleted).ToArray();
if (done.Length < 1)
return;
Log.Info($"Done: {done.Length}"); Log.Info($"Done: {done.Length}");
Log.Debug(string.Join("\n", done.Select(d => d.ToString()))); Log.Debug(string.Join("\n", done.Select(d => d.Key.ToString())));
foreach ((BaseWorker worker, Task<BaseWorker[]> task) in done) foreach ((BaseWorker worker, Task<BaseWorker[]> task) in done)
{ {
RunningWorkers.Remove(worker); RunningWorkers.Remove(worker);

View File

@ -88,6 +88,8 @@ public abstract class BaseWorker : Identifiable
DateTime endTime = DateTime.UtcNow; DateTime endTime = DateTime.UtcNow;
Log.Info($"Completed {this}\n\t{endTime.Subtract(startTime).TotalMilliseconds} ms"); Log.Info($"Completed {this}\n\t{endTime.Subtract(startTime).TotalMilliseconds} ms");
this.State = WorkerExecutionState.Completed; this.State = WorkerExecutionState.Completed;
if(this is IPeriodic periodic)
periodic.LastExecution = DateTime.UtcNow;
}); });
task.Start(); task.Start();
this.State = WorkerExecutionState.Running; this.State = WorkerExecutionState.Running;

View File

@ -2,7 +2,7 @@ namespace API.Workers;
public interface IPeriodic public interface IPeriodic
{ {
protected DateTime LastExecution { get; set; } internal DateTime LastExecution { get; set; }
public TimeSpan Interval { get; set; } public TimeSpan Interval { get; set; }
public DateTime NextExecution => LastExecution.Add(Interval); public DateTime NextExecution => LastExecution.Add(Interval);
public bool IsDue => NextExecution <= DateTime.UtcNow; public bool IsDue => NextExecution <= DateTime.UtcNow;