From c586c690d3774e950d0bcb0d914412b3998dc61e Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 3 Oct 2025 20:46:29 +0200 Subject: [PATCH] Refactor scheduling feature: remove unused CronParser, improve error handling in ScheduledRecurringTask. --- .../Features/SchedulingFeature.cs | 1 - .../ScheduledTasks/ScheduledRecurringTask.cs | 66 +++++++++++-------- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/modules/Elsa.Scheduling/Features/SchedulingFeature.cs b/src/modules/Elsa.Scheduling/Features/SchedulingFeature.cs index 9dd4ce1d4..1f232136c 100644 --- a/src/modules/Elsa.Scheduling/Features/SchedulingFeature.cs +++ b/src/modules/Elsa.Scheduling/Features/SchedulingFeature.cs @@ -48,7 +48,6 @@ public class SchedulingFeature : FeatureBase .AddScoped() .AddScoped() .AddScoped() - .AddSingleton(CronParser) .AddScoped(WorkflowScheduler) .AddBackgroundTask() .AddHandlersFrom() diff --git a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs index 89a75575d..822d717d5 100644 --- a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs +++ b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs @@ -86,41 +86,49 @@ public class ScheduledRecurringTask : IScheduledTask, IDisposable _timer.Elapsed += async (_, _) => { - _timer?.Dispose(); - _timer = null; - _startAt = _systemClock.UtcNow + _interval; - - using var scope = _scopeFactory.CreateScope(); - var commandSender = scope.ServiceProvider.GetRequiredService(); - var cancellationToken = _cancellationTokenSource.Token; - if (!cancellationToken.IsCancellationRequested) + try { - try - { - var acquired = await _executionSemaphore.WaitAsync(0, cancellationToken); - if (!acquired) return; - _executing = true; - await commandSender.SendAsync(new RunScheduledTask(_task), cancellationToken); - if (_cancellationRequested) + _timer?.Dispose(); + _timer = null; + _startAt = _systemClock.UtcNow + _interval; + + using var scope = _scopeFactory.CreateScope(); + var commandSender = scope.ServiceProvider.GetRequiredService(); + var cancellationToken = _cancellationTokenSource.Token; + if (!cancellationToken.IsCancellationRequested) + { + try { - _cancellationRequested = false; - _cancellationTokenSource.Cancel(); + var acquired = await _executionSemaphore.WaitAsync(0, cancellationToken); + if (!acquired) return; + _executing = true; + await commandSender.SendAsync(new RunScheduledTask(_task), cancellationToken); + + if (_cancellationRequested) + { + _cancellationRequested = false; + _cancellationTokenSource.Cancel(); + } + } + catch (Exception e) + { + _logger.LogError(e, "Error executing scheduled task"); + } + finally + { + _executing = false; + _executionSemaphore.Release(); } } - catch (Exception e) - { - _logger.LogError(e, "Error executing scheduled task"); - } - finally - { - _executing = false; - _executionSemaphore.Release(); - } - } - if (!cancellationToken.IsCancellationRequested) - Schedule(); + if (!cancellationToken.IsCancellationRequested) + Schedule(); + } + catch (ObjectDisposedException ex) + { + _logger.LogWarning(ex, "Service Provider was disposed."); + } }; }