Hier ist der Code in Frage:PLINQ Problem/Techniken multi-threaded, schleusenfreien Listen (in C#) impliment
parentNodes.AsParallel().ForAll(parent =>
{
List<Piece> plist = parent.Field.GetValidOrientations(pieceQueue[parent.Level]);
plist.ForEach(p =>
{
TreeNode child = new TreeNode(p, parent);
var score = child.CalculateScore(root);
levelNodes.Add(child);
});
});
On Laufzeit, dass Code gelegentlich null Referenzen in levelNodes verlässt. Ich vermute, dass dies auf Thread-Sperre zurückzuführen ist, da das Problem verschwindet, wenn ein normales (nicht paralleles) ForEach anstelle von ForAll aufgerufen wird.
Mit der PLINQ-Implementierung, 'levelNodes.Add (Kind);' wirft gelegentlich auch eine IndexOutOfRangeException mit der Meldung: "Quell-Array war nicht lang genug. Überprüfen Sie srcIndex und Länge und die unteren Grenzen des Arrays."
Irgendwelche Vorschläge, um dieses Problem zu beseitigen?
Oder vielleicht würde die Leistung mit einer Lock-Free-List-Implementierung erhöht werden? (Wie könnte man darüber gehen?)
Ja, ich bin nur mit der Elternknotenparallelität betroffen. (Die innere Schleife ist nur sequentiell). Danke für die ConcurrentBag-Referenz; das scheint meinen Bedürfnissen zu entsprechen. –