Tengo algunos problemas relacionados con Parallel for loops y agregarlos a una lista. El problema es que el mismo código puede generar resultados diferentes en diferentes momentos. He configurado algunos códigos de prueba a continuación. En este código, creo una lista de 10,000 valores int. 1/10 de los valores será 0, 1/10 de los valores será 1, hasta 1/10 de los valores siendo 9.Parallel For Loop - Problemas al agregar a una lista
Después de configurar esta lista, configuro un paralelo para el ciclo que itera a través de la lista. Si el número actual es 0, agrego un valor a una nueva lista. Una vez que se completa el bucle Parallel for, obtengo el tamaño de la lista. El tamaño siempre debe ser 1,000. La mayoría de las veces, se da la respuesta correcta. Sin embargo, he visto 3 posibles resultados incorrectos se producen:
- El tamaño de la lista es de menos de 1000
- Un IndexOutOfRangeException ocurre @
doubleList.Add(0.0);
- Un ArgumentException ocurre @
doubleList.Add(0.0);
El mensaje para el ArgumentException dado fue: Destination array was not long enough. Check destIndex and length, and the array's lower bounds.
¿Qué podría estar causando el error s? ¿Es esto un error de .Net? ¿Hay algo que pueda hacer para evitar que esto suceda?
Pruebe el código usted mismo. Si no obtiene un error, inténtelo algunas veces. Tenga en cuenta que probablemente no verá ningún error al usar una máquina de un solo núcleo.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ParallelTest
{
class Program
{
static void Main(string[] args)
{
List<int> intList = new List<int>();
List<double> doubleList = new List<double>();
for (int i = 0; i < 250; i++)
{
intList.Clear();
doubleList.Clear();
for (int j = 0; j < 10000; j++)
{
intList.Add(j % 10);
}
Parallel.For(0, intList.Count, j =>
{
if (intList[j] == 0)
{
doubleList.Add(0.0);
}
});
if (doubleList.Count != 1000)
{
Console.WriteLine("On iteration " + i + ": List size = " + doubleList.Count);
}
}
Console.WriteLine("\nPress any key to exit.");
Console.ReadKey();
}
}
}
¿qué es más probable un error de .NET o un error en SU código? –
Regla # 1 de depuración: el error está siempre en su código. Puede decir lo que está mal solo por el * título * de esto ... – Aaronaught