Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

229
Views
Uso de Task.WhenAll pero el éxito de cada tarea individual debe ser rastreado

El método original es el ciclo foreach ineficiente que espera cada trabajo (que es una llamada de red vinculada a E/S):

 foreach (var job in Jobs) { try { await DoJobAsync(job); //Pass job to external vendor API job.Succeeded = true; } catch (Exception) { //do nothing, let loop continue } }

Ahora, para mejorar el rendimiento, quiero usar Task.WhenAll para procesar todos los trabajos sin bloqueos.

Sin embargo, debemos asegurarnos de que cada objeto de job solo tenga la propiedad Succeeded establecida en true si la tarea DoJobAsync no arroja una excepción.

Si hacemos esto:

 await Task.WhenAll(Jobs.Select(j => { var task = DoJobAsync(j); j.Succeeded = true; return task; }));

Tengo entendido que si alguna tarea de trabajo termina arrojando una excepción, esa propiedad aún se cambiará a true porque cada tarea individual no se espera a medida que se crea, lo que hace que el flujo de código pase directamente.

Sé que puedo capturar la Task devuelta por Task.WhenAll para tener acceso a una lista de todas las excepciones lanzadas, pero no puedo encontrar una manera de usarlas para rastrear el job que lanzó la excepción.

¿Cómo soluciono este problema?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Devuelve el resultado verdadero/falso del método DoJobAsync().

De esta manera puede devolver el resultado directamente.

 await Task.WhenAll(Jobs.Select(j => { return DoJobAsync(j); }));
over 4 years ago · Santiago Trujillo Report

0

Podría usar un delegado asíncrono como selector del operador Select :

 await Task.WhenAll(Jobs.Select(async job => { await DoJobAsync(job); job.Succeeded = true; }));

De esta forma, cada trabajo se proyectará en una Task que no será la DoJobAsync(job) original, sino una tarea contenedora que encapsula la lógica para actualizar la propiedad Succeeded . Esta propiedad se actualizará inmediatamente después de que la DoJobAsync(job) se complete correctamente.

Es posible que varios objetos Job tengan su propiedad Succeeded actualizada en paralelo. Depende de si un SynchronizationContext está instalado en el subproceso actual.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!