using System; using System.Threading; using System.Threading.Tasks; using BotFramework.Abstractions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace Kruzya.TelegramBot.Core.Service; public abstract class AbstractTimedHostedService : IHostedService, IDisposable { private Timer _timer; protected readonly ILogger _logger; protected readonly IBotInstance _bot; protected virtual TimeSpan TimerPeriod => TimeSpan.FromSeconds(45); protected AbstractTimedHostedService(ILogger logger, IBotInstance bot) { _bot = bot; _logger = logger; } #region IHostedService public Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("Message sender service is starting."); _timer = new Timer(Run, null, TimeSpan.Zero, TimerPeriod); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("Message sender service is stopping."); _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } #endregion #region IDisposable /// /// Disposes the timer. /// public void Dispose() { _timer?.Dispose(); } #endregion private async void Run(object state) { _timer?.Change(Timeout.Infinite, 0); try { await OnRun(); } finally { var timerPeriod = TimerPeriod; _timer?.Change(timerPeriod, timerPeriod); } } protected virtual async Task OnRun() { await Task.Delay(500); } }