62 lines
1.5 KiB
C#
62 lines
1.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|