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 dataInicial = datasIniciais.Values.Min(); // Criar um timer que reseta a cada segundo 00 _ = Task.Run(() => ResetarLimitePorMinuto()); Console.WriteLine($"Buscando dados de {dataInicial} até {dataFinal}..."); string xmlRequest = PrepararXML(dataInicial, dataFinal); await _requestLimiter.WaitAsync(); string resposta = await _httpClient.EnviarRequisicaoAsync(xmlRequest); _requestLimiter.Release(); // Criar processador e processar XML var processor = new PLDProcessor(); var plds = processor.ProcessarXML(resposta); // Atualiza ambos os bancos apenas se houver novos dados if (plds.Count > 0) { // Para cada repositório, passar a data inicial correta Parallel.ForEach(datasIniciais, kvp => { var repo = kvp.Key; var ultimaData = kvp.Value; repo.SalvarPLDs(plds, ultimaData); }); Console.WriteLine("PLDs 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"); } }