Convirtiendo Parallel ForEach en PLINQ para procesar una lista de tareas
Estoy tratando de cargar la mayor cantidad de mensajes posible en un servidor lo más rápido posible. Actualmente tengo este fragmento de código y para cargar 50000 mensajes en un servidor de mensajería, lleva alrededor de 5 minutos. Esta es una lista de tareas que tienen el nombre del servidor, el nombre de la cola y el mensaje para colocar en la cola.
taskList.Add(new Task(() => PlaceMessageOnQueue(server, queueName, message)));
Este es el código actual que tengo, pero quiero convertir esto a PLINQ con la esperanza de que sea aún más rápido.
_= Parallel.ForEach(task, new ParallelOptions()
{
MaxDegreeOfParallelism = Environment.ProcessorCount; //Tengo 4 núcleos
},t => {
t.Start();
t.Wait();
Console.WriteLine(t.Status)
});
Hasta ahora, esto no está iniciando las tareas. Este es el código a continuación en el que necesito ayuda.
var results = task.
.AsParallel()
.AsOrdered()
.WithDegreeofParallelism(Environment.ProcessorCount)
.ToList();
davy.ai
Para mejorar el rendimiento de carga de mensajes en un servidor, puedes utilizar PLINQ para paralelizar la ejecución de las tareas. Aquí tienes un ejemplo de cómo podrías modificar tu código:
En este ejemplo, creamos un objeto
ParallelOptions
para establecer el grado máximo de paralelismo como el número de núcleos del procesador en la máquina. Luego utilizamos el método de extensiónAsParallel
para crear una consulta paralela a partir de la lista de tareas. Especificamos el grado de paralelismo para que coincida con el número de núcleos del procesador establecido enParallelOptions
.Luego utilizamos el operador
Select
para recorrer cada tarea, iniciarla, esperar a que se complete y devolver su estado. Los resultados se recopilan en una lista utilizando el métodoToList
.Al utilizar PLINQ, la ejecución de las tareas se puede distribuir en varios núcleos del procesador, lo que debería mejorar la velocidad a la que se cargan los mensajes en el servidor. Sin embargo, ten en cuenta que los recursos del servidor y la latencia de la red aún pueden limitar el rendimiento general.