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() { List datasIniciais = _repositories.ConvertAll(repo => repo.ObterDataInicial()); DateTime dataInicial = DateTime.MinValue; foreach (var data in datasIniciais) { if (data > dataInicial) dataInicial = data; } DateTime dataFinal = DateTime.Now.AddDays(1); // 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) { Parallel.ForEach(_repositories, repo => repo.SalvarPLDs(plds)); 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"); } private List ProcessarXML(string xml) { // Simulação de parser XML (substituir pela lógica real) return new List { new PLDModel(DateTime.Now, 1, "Sul", 123.45, "2403", 3) }; } }