namespace OSS.Tools.TimerJob;
///
/// 任务定时器 基类
///
public class TimerTriggerJob : Internal_BaseExecutor, IDisposable
{
private Timer? _timer;
private CancellationToken _cancellationToken = CancellationToken.None;
#region 构造函数
///
/// 触发器配置信息
///
public TimerTriggerSetting Setting { get; }
///
/// 构造函数
///
/// 触发器配置信息
public TimerTriggerJob(TimerTriggerSetting setting)
{
Setting = setting;
}
#endregion
#region 重写内部方法
internal override Task InternalStartJob(CancellationToken cancellationToken)
{
return StartTimerTrigger(cancellationToken);
}
internal override Task InternalStopJob(CancellationToken cancellationToken)
{
return StopTimerTrigger(cancellationToken);
}
#endregion
#region 定时器 开始 结束方法
///
/// 配置并触发定时器
///
///
private Task StartTimerTrigger(CancellationToken cancellationToken)
{
if (cancellationToken != CancellationToken.None)
{
_cancellationToken = cancellationToken;
}
if (_timer == null)
_timer = new Timer(ExecuteJob, null, Setting.DueTime, Setting.PeriodTime);
else
_timer.Change(Setting.DueTime, Setting.PeriodTime);
return Task.CompletedTask;
}
///
/// 停止定时器
///
private Task StopTimerTrigger(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, Timeout.Infinite);
return Setting.JobExecutor.StopAsync(cancellationToken);
}
private void ExecuteJob(object? obj)
{
Setting.JobExecutor?.StartAsync(_cancellationToken).Wait(_cancellationToken);
}
///
void IDisposable.Dispose() => _timer?.Dispose();
#endregion
}