es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , ,

Answer

  1. Avatar for 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 con Select de LINQ para crear y ejecutar múltiples tareas de forma asíncrona, y luego utilizar el objeto Task 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étodo ToList. Aquí hay un ejemplo:

    using System.Threading.Tasks;
    using Newtonsoft.Json;
    using System.Collections.Generic;
    using System.Net;
    
    static class Program
    {
        static async Task Main()
        {
            List<dynamic> writeList = new List<dynamic>();
            string[] urls = { "www.someJsonlink1.com", "www.someJsonlink2.com", "www.someJsonlink3.com" };
    
            IEnumerable<><dynamic>> tasksQuery = urls.Select(url => savePageDataAsync(url));
            Task<dynamic>[] tasks = tasksQuery.ToArray();
    
            await Task.WhenAll(tasks);
    
            writeList = tasks.Select(t => t.Result).ToList();
        }
    
        static async Task<dynamic> savePageDataAsync(string url)
        {
            WebClient client = new WebClient();
            string page = await client.DownloadStringTaskAsync(url);
            var data = JsonConvert.DeserializeObject(page);
            return data;
        }
    }
    

    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étodo Select de LINQ para crear una enumeración de tareas que llaman al método savePageDataAsync con cada URL como parámetro. Luego, usamos el método ToArray 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étodo ToList y la asignamos a la variable writeList.

    El método savePageDataAsync se modifica para ser asíncrono y utiliza el método DownloadStringTaskAsync para descargar el contenido de la URL como una cadena de forma asíncrona. El método JsonConvert.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.

Comments are closed.