Tenemos una función de servicio web que ejecuta una lista de tareas en segundo plano. Cuando se completan todas las tareas, vuelve. He volvió a examinar la función para C# 5. Me las he arreglado para obtener el siguiente fragmento de trabajo:Reescribir la espera de múltiples hilos usando async/await
var result = new List<int>();
var tasks = new List<Task<int>>();
foreach (var row in rowlist)
tasks.Add(Task.Factory.StartNew(() => DoWork(row)));
foreach (var task in tasks)
result.Add(task.Result);
Los task.Result
espera la tarea individual por hacer. He probado esto agregando un retraso de tres segundos al método DoWork
y verificando que termine en menos de 5 segundos, para obtener una lista de 10 tareas.
Ahora he intentado reescribir la función utilizando la nueva sintaxis async/await
. Pero parece que no puedo hacer que funcione. Si se compila, se ejecuta de forma síncrona, como se verificó al agregar una espera.
Cualquier ideas sobre cómo se puede volver a escribir el código anterior utilizando async/await
?
Esto se ejecuta de manera asincrónica. Pero da como resultado una excepción interna 'System.AggregateException'' {"Los resultados de la consulta no se pueden enumerar más de una vez."} '¿Alguna idea? – Andomar
Quizás más importante: ¿por qué se ejecuta de forma sincronizada si omite la línea con 'await'? – Andomar
@Andomar Llamada 'ToList' después de' Seleccionar' al crear las tareas. Eso debería arreglar el error. Actualmente, cuando se enumeran 'tasks' varias veces, se trataría de crear las nuevas tareas dos veces, lo que sería malo. – Servy