protected override async Task ExecuteAsync(CancellationToken stoppingToken) { var scheduleable = typeof(IBackgroundTaskScheduleable); var serviceTypes = Assembly.GetExecutingAssembly() .GetTypes() .Where(o => o.GetInterface(scheduleable.FullName) != null) .ToList(); if (serviceTypes.Count == 0) { return; } while (!stoppingToken.IsCancellationRequested) { try { using var scope = Provider.CreateScope(); foreach (var type in serviceTypes) { if (scope.ServiceProvider.GetService(type) is not IBackgroundTaskScheduleable service) { continue; } if (service.CanScheduleTask(GetLastSchedule(type))) { foreach (var task in service.GetBackgroundTasks()) { Queue.Add(task); } LastSchedulesAt[type] = DateTime.Now; } } } catch (Exception ex) { var message = new LogMessage(LogSeverity.Error, nameof(BackgroundTaskScheduler), "Scheduling tasks failed.", ex); await BotLoggingService.OnLogAsync(message); } finally { await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken); } } }