using System.Threading;
using System.Threading.Tasks;
namespace OSS.Tools.TimerJob
{
///
/// 任务基类
/// 如果执行时间过长,重复触发时 当前任务还在进行中,则不做任何处理
///
public abstract class BaseInternalExecutor : IJobExecutor
{
private bool _isRunning = false;
private bool _jobCommandStarted = false;
///
/// 任务名称
///
public string JobName { get; protected set; }
///
/// 运行状态
///
public StatusFlag StatusFlag
{
get
{
if (_jobCommandStarted && _isRunning)
return StatusFlag.Running;
if (_jobCommandStarted && !_isRunning)
return StatusFlag.Waiting;
if (!_jobCommandStarted && _isRunning)
return StatusFlag.Stopping;
return StatusFlag.Stopped;
}
}
///
/// 开始任务
///
public Task StartAsync()
{
return StartAsync(CancellationToken.None);
}
///
/// 开始任务
///
public async Task StartAsync(CancellationToken cancellationToken)
{
// 任务依然在执行中,不需要再次唤起
if (_isRunning)
return;
_isRunning = _jobCommandStarted = true;
if (!cancellationToken.IsCancellationRequested)
{
await InternalStartJob(cancellationToken);
}
_isRunning = false;
}
internal abstract Task InternalStartJob(CancellationToken cancellationToken);
///
/// 结束任务
///
public Task StopAsync()
{
return StopAsync(CancellationToken.None);
}
///
/// 结束任务
///
public Task StopAsync(CancellationToken cancellationToken)
{
_jobCommandStarted = false;
return OnStoped(cancellationToken);
}
///
/// 任务停止
///
///
///
protected virtual Task OnStoped(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}