Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

55
Visualizações
SemaphoreSlim frente a procesamiento paralelo para llamadas posteriores a la API en .NET

Tengo un trabajo cron que llama a una tabla de base de datos y obtiene alrededor de medio millón de registros devueltos. Necesito recorrer todos esos datos y enviar publicaciones de API a una API de terceros. En general, esto funciona bien, pero el tiempo de procesamiento es eterno (10 horas). Necesito una manera de acelerarlo. He estado tratando de usar una lista de Tareas con SemaphoreSlim, pero tengo problemas (no me gusta que mi llamada API devuelva una Tarea). Me pregunto si alguien tiene una solución para esto que no destruya la memoria de la máquina virtual.

El código actual se parece a:

 foreach(var data in dataList) { try { var response = await _apiService.PostData(data); _logger.Trace(response.Message); } catch// }

Pero estoy tratando de hacer esto y me sale mal la sintaxis:

 var tasks = new List<Task<DataObj>>(); var throttler = new SemaphoreSlim(10); foreach(var data in dataList) { await throttler.WaitAsync(); tasks.Add(Task.Run(async () => { try { var response = await _apiService.PostData(data); _logger.Trace(response.Message); } finally { throttler.Release(); } })); }
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Su lista es del tipo Task<DataObj> , pero su lambda async no devuelve nada, por lo que su tipo de devolución es Task . Para corregir la sintaxis, simplemente devuelva el valor:

 var response = await _apiService.PostData(data); _logger.Trace(response.Message); return response;

Como otros han señalado en los comentarios, también recomiendo no usar Task.Run aquí. Un método async local funcionaría bien:

 var tasks = new List<Task<DataObj>>(); var throttler = new SemaphoreSlim(10); foreach(var data in dataList) { tasks.Add(ThrottledPostData(data)); } var results = await Task.WhenAll(tasks); async Task<DataObj> ThrottledPostData(Data data) { await throttler.WaitAsync(); try { var response = await _apiService.PostData(data); _logger.Trace(response.Message); return response; } finally { throttler.Release(); } }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda