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(); } } }