using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using PI_Assync_PLD.Models; public class PLDService { private readonly HttpClientService _httpClient; private readonly List _repositories; private readonly SemaphoreSlim _requestLimiter = new SemaphoreSlim(5); // Limite de 5 requisições simultâneas public PLDService(HttpClientService httpClient, List repositories) { _httpClient = httpClient; _repositories = repositories; } public async Task SincronizarPLDsAsync() { Dictionary datasIniciais = _repositories .ToDictionary(repo => repo, repo => repo.ObterDataInicial()); DateTime dataFinal = DateTime.Now.Date.AddDays(1); DateTime menorDataInicial = datasIniciais.Values.Min(); // Criar um timer que reseta a cada minuto no segundo 00 _ = Task.Run(() => ResetarLimitePorMinuto()); Console.WriteLine($"Buscando dados de {menorDataInicial} até {dataFinal} em períodos de 1 dia..."); List> tarefasRequisicoes = new List>(); for (DateTime data = menorDataInicial; data < dataFinal; data = data.AddDays(1)) { DateTime dataInicio = data; DateTime dataFim = dataInicio.AddDays(1); tarefasRequisicoes.Add(Task.Run(async () => { await _requestLimiter.WaitAsync(); string xmlResponse = await _httpClient.EnviarRequisicaoAsync(PrepararXML(dataInicio, dataFim)); _requestLimiter.Release(); return xmlResponse; })); } // Aguarda todas as requisições finalizarem e junta os resultados string[] respostasXML = await Task.WhenAll(tarefasRequisicoes); // Criar processador e consolidar todos os PLDs var processor = new PLDProcessor(); List todosPLDs = new List(); foreach (string xml in respostasXML) { todosPLDs.AddRange(processor.ProcessarXML(xml)); } // Atualiza ambos os bancos apenas se houver novos dados if (todosPLDs.Count > 0) { Parallel.ForEach(datasIniciais, kvp => { var repo = kvp.Key; var ultimaData = kvp.Value; repo.SalvarPLDs(todosPLDs, ultimaData); }); Console.WriteLine($"PLDs de {menorDataInicial} a {dataFinal} salvos com sucesso."); } } private void ResetarLimitePorMinuto() { while (true) { DateTime now = DateTime.Now; int delay = (60 - now.Second) * 1000; Thread.Sleep(delay); _requestLimiter.Release(5); } } private string PrepararXML(DateTime inicio, DateTime fim) { string xmlTemplate = System.IO.File.ReadAllText(@"X:\Back\PLD Horário\listarPLD.txt"); return xmlTemplate.Replace("DATA_INI", inicio.ToString("yyyy-MM-ddT00:00:00")) .Replace("DATA_FIM", fim.ToString("yyyy-MM-ddT00:00:00")) .Replace("PAG_NUM", "1"); } }