From e9f64f49c2117a62c57ad54b4e8279d743286610 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 24 Jul 2024 14:26:37 +0200 Subject: [PATCH] Implement IDisposable for scheduled tasks Added IDisposable interface to scheduled task classes to ensure proper resource cleanup. Specifically, added dispose methods to release timers and cancellation tokens where applicable. --- .../Elsa.Scheduling/ScheduledTasks/ScheduledCronTask.cs | 8 +++++++- .../ScheduledTasks/ScheduledRecurringTask.cs | 8 +++++++- .../ScheduledTasks/ScheduledSpecificInstantTask.cs | 8 +++++++- .../Contexts/ActivityExecutionContext.cs | 8 +++++++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledCronTask.cs b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledCronTask.cs index dcaf25ae7..180d60713 100644 --- a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledCronTask.cs +++ b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledCronTask.cs @@ -10,7 +10,7 @@ namespace Elsa.Scheduling.ScheduledTasks; /// /// A task that is scheduled using a given cron expression. /// -public class ScheduledCronTask : IScheduledTask +public class ScheduledCronTask : IScheduledTask, IDisposable { private readonly ISystemClock _systemClock; private readonly ILogger _logger; @@ -97,4 +97,10 @@ public class ScheduledCronTask : IScheduledTask if (!cancellationToken.IsCancellationRequested) Schedule(); }; } + + void IDisposable.Dispose() + { + _timer?.Dispose(); + _cancellationTokenSource.Dispose(); + } } \ No newline at end of file diff --git a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs index 95331417c..9a2dde7a4 100644 --- a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs +++ b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledRecurringTask.cs @@ -9,7 +9,7 @@ namespace Elsa.Scheduling.ScheduledTasks; /// /// A scheduled recurring task. /// -public class ScheduledRecurringTask : IScheduledTask +public class ScheduledRecurringTask : IScheduledTask, IDisposable { private readonly ITask _task; private readonly ISystemClock _systemClock; @@ -87,4 +87,10 @@ public class ScheduledRecurringTask : IScheduledTask if (!cancellationToken.IsCancellationRequested) Schedule(); }; } + + void IDisposable.Dispose() + { + _cancellationTokenSource.Dispose(); + _timer?.Dispose(); + } } diff --git a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledSpecificInstantTask.cs b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledSpecificInstantTask.cs index 3a4604cc3..1ec49bfb5 100644 --- a/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledSpecificInstantTask.cs +++ b/src/modules/Elsa.Scheduling/ScheduledTasks/ScheduledSpecificInstantTask.cs @@ -9,7 +9,7 @@ namespace Elsa.Scheduling.ScheduledTasks; /// /// A task that is scheduled to execute at a specific instant. /// -public class ScheduledSpecificInstantTask : IScheduledTask +public class ScheduledSpecificInstantTask : IScheduledTask, IDisposable { private readonly ITask _task; private readonly ISystemClock _systemClock; @@ -58,4 +58,10 @@ public class ScheduledSpecificInstantTask : IScheduledTask await commandSender.SendAsync(new RunScheduledTask(_task), cancellationToken); }; } + + void IDisposable.Dispose() + { + _cancellationTokenSource.Dispose(); + _timer?.Dispose(); + } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs index 35b07b055..9d24cae08 100644 --- a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs +++ b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs @@ -17,7 +17,7 @@ namespace Elsa.Workflows; /// Represents the context of an activity execution. /// [PublicAPI] -public partial class ActivityExecutionContext : IExecutionContext +public partial class ActivityExecutionContext : IExecutionContext, IDisposable { private readonly ISystemClock _systemClock; private readonly List _bookmarks = new(); @@ -676,4 +676,10 @@ public partial class ActivityExecutionContext : IExecutionContext { return ExpressionExecutionContext.TryGetBlock(locationBlockReference, out var memoryBlock) ? memoryBlock : default; } + + void IDisposable.Dispose() + { + _cancellationRegistration.Dispose(); + _cancellationTokenSource.Dispose(); + } } \ No newline at end of file