diff --git a/WarhoundConsole/Job.cs b/WarhoundConsole/Job.cs new file mode 100644 index 0000000..4d00d3f --- /dev/null +++ b/WarhoundConsole/Job.cs @@ -0,0 +1,61 @@ +namespace WarhoundConsole +{ + public abstract class Job + { + private readonly TimeSpan interval; + + private Task task; + private DateTime lastExecutedTime; + + public Job(TimeSpan interval) + { + if (interval <= TimeSpan.Zero) + { + throw new ArgumentOutOfRangeException(nameof(interval)); + } + + this.interval = interval; + this.task = Task.CompletedTask; + this.lastExecutedTime = DateTime.MinValue; + } + + public bool TryExecute() + { + try + { + var now = DateTime.Now; + if (now - this.lastExecutedTime < this.interval) + { + return false; + } + + if (!this.task.IsCompleted) + { + // 이 경우 로그를 출력하도록 하고, 타이밍을 조절해야한다. + //Console.WriteLine($"Job skipped at {DateTime.Now}"); + return false; + } + + this.lastExecutedTime = now; + + this.task = Task.Run(async () => + { + await this.Execute(); + }); + } + catch (Exception e) + { + Console.WriteLine(e); + } + + return true; + } + + protected abstract Task Execute(); + + public void Wait() + { + this.task?.Wait(); + } + } +} diff --git a/WarhoundConsole/Program.cs b/WarhoundConsole/Program.cs index d436ff9..055e4df 100644 --- a/WarhoundConsole/Program.cs +++ b/WarhoundConsole/Program.cs @@ -24,13 +24,18 @@ namespace WarhoundConsole { Singleton.I.Initialize(new()); + var jobs = new List(); + var sw = Stopwatch.StartNew(); while (!Singleton.I.ExitRequested) { try { sw.Restart(); - MainLoop(); + foreach (var job in jobs) + { + _ = job.TryExecute(); + } sw.Stop(); const int targetFrameTimeMs = 10; @@ -45,14 +50,14 @@ namespace WarhoundConsole } } + foreach (var job in jobs) + { + job.Wait(); + } + Shutdown(); } - private static void MainLoop() - { - - } - private static void Shutdown() { // DO SOMETHING