¿Cómo ejecutar múltiples tareas al mismo tiempo y agregar los valores de retorno a una lista?
¿Cuál es la manera más fácil de ejecutar múltiples tareas al mismo tiempo y agregar sus valores de retorno a una lista en c sharp?
He intentado un par de maneras, pero probablemente lo estoy haciendo todo mal, por lo tanto, no tengo mucho código para publicar aquí.
ACTUALIZACIÓN:
Aquí está uno de mis intentos fallidos. Básicamente, estoy tratando de obtener el diccionario JSON de un enlace (los enlaces serán diferentes para cada tarea) y agregar todos los diccionarios JSON a una sola lista al final. Pero quiero que todas las tareas se ejecuten al mismo tiempo.
static class Program
{
static void Main()
{
List<dynamic> writeList = new List<dynamic>();
for (int i = 0; i <= 50; i++)
{
Task<dynamic> task = Task<dynamic>.Factory.StartNew(
() => savePageData("www.someJsonlink.com"));
writeList.Add(task);
}
}
static dynamic savePageData(string url)
{
WebClient client = new WebClient();
string page = client.DownloadString(url);
var data = JsonConvert.DeserializeObject(page);
return data;
}
}
El problema con este enfoque es que nada se agrega a la lista. De hecho, tampoco se establece ninguna conexión con el enlace. Pero cuando se hace de forma normal, los datos están presentes.
davy.ai
Para ejecutar múltiples tareas al mismo tiempo y agregar sus valores de retorno a una lista en C#, se puede utilizar el método
Task.WhenAll
junto conSelect
de LINQ para crear y ejecutar múltiples tareas de forma asíncrona, y luego utilizar el objetoTask
resultante para esperar la finalización de todas las tareas y devolver sus resultados como un array. Finalmente, se puede convertir el array en una lista utilizando el métodoToList
. Aquí hay un ejemplo:En este ejemplo, creamos una lista
writeList
para almacenar los resultados de las tareas. También creamos una matriz de URLs que se utilizarán para obtener datos JSON de diferentes enlaces. Utilizamos el métodoSelect
de LINQ para crear una enumeración de tareas que llaman al métodosavePageDataAsync
con cada URL como parámetro. Luego, usamos el métodoToArray
para convertir la enumeración en una matriz de tareas.A continuación, utilizamos el método
Task.WhenAll
para esperar la finalización de todas las tareas. Este método devuelve una tarea que se completa cuando todas las tareas suministradas han sido completadas. Esperamos esta tarea para esperar que todas las tareas se completen de forma asíncrona.Después de la finalización, utilizamos el método
Select
de nuevo para crear una enumeración de los resultados devueltos por las tareas completadas. Luego, convertimos esta enumeración en una lista utilizando el métodoToList
y la asignamos a la variablewriteList
.El método
savePageDataAsync
se modifica para ser asíncrono y utiliza el métodoDownloadStringTaskAsync
para descargar el contenido de la URL como una cadena de forma asíncrona. El métodoJsonConvert.DeserializeObject
se utiliza para deserializar la cadena JSON en un objeto dinámico.Tenga en cuenta que debe manejar cualquier excepción que pueda ocurrir durante la ejecución de las tareas, como errores de red o deserialización de JSON.