Je rencontre des problèmes avec Parallel for Loops et l'ajout à une liste. Le problème est que le même code peut générer une sortie différente à différents moments. J'ai mis en place un code de test ci-dessous. Dans ce code, je crée une liste de 10 000 valeurs int. 1/10ème des valeurs sera 0, 1/10ème des valeurs sera 1, jusqu'à 1/10ème des valeurs étant 9.Parallel For Loop - Problèmes lors de l'ajout à une liste
Après avoir configuré cette liste, j'ai configuré une boucle parallèle pour qui itère à travers la liste. Si le nombre actuel est 0, j'ajoute une valeur à une nouvelle liste. Une fois la boucle Parallel for terminée, je génère la taille de la liste. La taille devrait toujours être 1000. La plupart du temps, la bonne réponse est donnée. Cependant, je l'ai vu 3 résultats incorrects possibles se produisent:
- La taille de la liste est inférieure à 1 000
- Un IndexOutOfRangeException se produit @
doubleList.Add(0.0);
- Un ArgumentException se produit @
doubleList.Add(0.0);
Le message pour le ArgumentException donné était: Destination array was not long enough. Check destIndex and length, and the array's lower bounds.
Ce qui pourrait être à l'origine de l'erreur s? Est-ce un bug .Net? Y a-t-il quelque chose que je puisse faire pour empêcher cela de se produire?
Veuillez essayer le code pour vous-même. Si vous n'obtenez pas d'erreur, essayez-le plusieurs fois. Veuillez également noter que vous ne verrez probablement aucune erreur en utilisant une machine monocœur.
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();
}
}
}
quoi de plus probable un bug .NET ou un bug dans votre code? –
Règle n ° 1 du débogage: Le bug est toujours dans votre code. Vous pouvez dire ce qui ne va pas juste à partir du * titre * de cette ... – Aaronaught