namespace Elsa.Common.RecurringTasks; public class ScheduledTimer : IDisposable, IAsyncDisposable { private readonly Func _action; private readonly Func _interval; private readonly Timer _timer; public ScheduledTimer(Func action, Func interval) { _action = action; _interval = interval; _timer = new Timer(Callback, null, interval(), Timeout.InfiniteTimeSpan); } private async void Callback(object? state) { await _action(); _timer.Change(_interval(), Timeout.InfiniteTimeSpan); } public void Dispose() { _timer.Dispose(); } public async ValueTask DisposeAsync() { await _timer.DisposeAsync(); } }