public async Task Run( [TimerTrigger("0 0 15 23 * *")] TimerInfo timer, ILogger logger) { var now = _currentDateTime.Now; logger.LogInformation($"Starting {nameof(ImportLevyDeclarationsJob)}"); var employerAccounts = await _accountRepository.GetAllAccounts(); logger.LogInformation($"Updating {employerAccounts.Count} levy accounts"); var messageTasks = new List <Task>(); var sendCounter = 0; foreach (var account in employerAccounts) { var schemes = await _payeRepository.GetGovernmentGatewayOnlySchemesByEmployerId(account.Id); if (schemes?.SchemesList == null) { continue; } foreach (var scheme in schemes.SchemesList) { logger.LogDebug($"Creating update levy account message for account {account.Name} (ID: {account.Id}) scheme {scheme.EmpRef}"); messageTasks.Add(_messageSession.Send(new ImportAccountLevyDeclarationsCommand(account.Id, scheme.EmpRef))); } sendCounter++; if (sendCounter % 1000 == 0) { await Task.WhenAll(messageTasks); logger.LogInformation($"Queued {sendCounter} of {employerAccounts.Count} accounts."); messageTasks.Clear(); await Task.Delay(1000); } } // await final tasks not % 1000 await Task.WhenAll(messageTasks); logger.LogInformation($"{nameof(ImportLevyDeclarationsJob)} completed."); }