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