diff --git a/src/Longbow.Tasks/Scheduler/DefaultScheduler.cs b/src/Longbow.Tasks/Scheduler/DefaultScheduler.cs index 597e395c31cbaf98f0b6b72ecafef19d880bbe88..d5444d601950905b3e1335c9d97eefe96c9127c7 100644 --- a/src/Longbow.Tasks/Scheduler/DefaultScheduler.cs +++ b/src/Longbow.Tasks/Scheduler/DefaultScheduler.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; namespace Longbow.Tasks; @@ -51,6 +52,11 @@ internal class DefaultScheduler : IScheduler /// public ITask? Task { get; set; } + public void RunNow() + { + SchedulerProcess?.Triggers.FirstOrDefault()?.RunNow(new CancellationToken()); + } + /// /// 获得/设置 任务调度状态 /// diff --git a/src/Longbow.Tasks/Scheduler/IScheduler.cs b/src/Longbow.Tasks/Scheduler/IScheduler.cs index b78b1b167c9015f553472f9933f346a74e96eef7..921770e568fc173aefbf9c676ffccfe6e10f7a09 100644 --- a/src/Longbow.Tasks/Scheduler/IScheduler.cs +++ b/src/Longbow.Tasks/Scheduler/IScheduler.cs @@ -54,4 +54,9 @@ public interface IScheduler /// 获得 调度器相关联任务 /// ITask? Task { get; } + + /// + /// 立即运行 + /// + void RunNow(); } diff --git a/src/Longbow.Tasks/Scheduler/SchedulerProcess.cs b/src/Longbow.Tasks/Scheduler/SchedulerProcess.cs index 43dcbb4666e547be96bf38122daeabf269c7b4c4..98cffce846d397d3a413f1e6de7df405e348ef95 100644 --- a/src/Longbow.Tasks/Scheduler/SchedulerProcess.cs +++ b/src/Longbow.Tasks/Scheduler/SchedulerProcess.cs @@ -116,6 +116,7 @@ internal class SchedulerProcess(DefaultScheduler scheduler, Action logge var taskToken = CancellationTokenSource.CreateLinkedTokenSource(token, taskCancelTokenSource.Token); if (!taskToken.IsCancellationRequested && TaskContext != null) { + trigger.LastResult = TriggerResult.Running; await TaskContext.Execute(taskToken.Token).ConfigureAwait(false); trigger.LastResult = TriggerResult.Success; } diff --git a/src/Longbow.Tasks/Trigger/TriggerProcess.cs b/src/Longbow.Tasks/Trigger/TriggerProcess.cs index 8b63bbc24e99e0dde25a948c3c14980fccdd6aaf..1894a71e09ab425ad8ecaae970b39502a48c9d30 100644 --- a/src/Longbow.Tasks/Trigger/TriggerProcess.cs +++ b/src/Longbow.Tasks/Trigger/TriggerProcess.cs @@ -77,17 +77,9 @@ internal class TriggerProcess(string name, Action loggerAction, ITrigger while (!_cancelTokenSource.IsCancellationRequested) { if (!Trigger.Pulse(_cancelTokenSource.Token)) break; - LoggerAction($"{Trigger.GetType().Name} PulseAsync() Trigger.Enabled({Trigger.Enabled}) Cancelled({_cancelTokenSource.IsCancellationRequested})"); - // 立刻运行一次 - var sw = Stopwatch.StartNew(); - await DoWork(_cancelTokenSource.Token).ConfigureAwait(false); - sw.Stop(); - - Trigger.LastRunElapsedTime = sw.Elapsed; - Trigger.PulseCallback?.Invoke(Trigger); - LoggerAction($"{Trigger.GetType().Name} {nameof(DoWork)}({Trigger.LastResult}) Elapsed: {Trigger.LastRunElapsedTime} NextRuntime: {Trigger.NextRuntime}"); + await RunNow(_cancelTokenSource.Token); if (Trigger.NextRuntime == null) break; // 持久化 @@ -104,4 +96,20 @@ internal class TriggerProcess(string name, Action loggerAction, ITrigger _triggerCancelTokenSource?.Cancel(); LoggerAction($"{nameof(TriggerProcess)} Stop() called"); } + + /// + /// 立即执行一次 + /// + /// + public async Task RunNow(CancellationToken cancellationToken) + { + // 立刻运行一次 + var sw = Stopwatch.StartNew(); + await DoWork(cancellationToken).ConfigureAwait(false); + sw.Stop(); + + Trigger.LastRunElapsedTime = sw.Elapsed; + Trigger.PulseCallback?.Invoke(Trigger); + LoggerAction($"{Trigger.GetType().Name} {nameof(DoWork)}({Trigger.LastResult}) Elapsed: {Trigger.LastRunElapsedTime} NextRuntime: {Trigger.NextRuntime}"); + } } diff --git a/src/Longbow.Tasks/Trigger/TriggerResult.cs b/src/Longbow.Tasks/Trigger/TriggerResult.cs index 204e61f24bd44f5e3720da103fc2d1d554738d78..e0e63f8f67a552b70579eb847524f6dec772e175 100644 --- a/src/Longbow.Tasks/Trigger/TriggerResult.cs +++ b/src/Longbow.Tasks/Trigger/TriggerResult.cs @@ -25,5 +25,10 @@ public enum TriggerResult /// /// 故障 /// - Error = 3 + Error = 3, + + /// + /// 正在运行 + /// + Running = 4 }