public async Task DoWorkAsync(CancellationToken cancellationToken) { _logger.LogInformation("Starting alert scan"); try { var scanTime = DateTime.UtcNow; var scansByMiner = from definition in await _alertDefinitionService.GetEnabledAsync(cancellationToken) group definition by definition.MinerId into definitions let miner = _minerService.GetByIdAsync(definitions.Key, cancellationToken).Result select new { Miner = miner, Scans = definitions.Select(d => _scanFactory.CreateScan(d, miner, scanTime)).ToList() }; foreach (var scans in scansByMiner) { var scanPeriod = Period.Merge(scans.Scans.Select(s => s.ScanPeriod)); var snapshots = (await _snapshotService.GetByMinerAsync(scans.Miner.Id, scanPeriod, cancellationToken)).ToList(); await ScanMinerAsync(scanTime, scans.Miner, scans.Scans, snapshots, cancellationToken); } } catch (Exception ex) { _logger.LogError(ex, "Error performing alert scan"); } _logger.LogInformation("Finished alert scan"); }