Вот код, о котором идет речь:
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);
});
});
Во время выполнения этот код иногда оставляет нулевые ссылки в узлах уровня. Я подозреваю, что это связано с блокировкой потока, потому что проблема исчезает, если вместо ForAll вызывается обычный (не параллельный) ForEach.
С имплементацией PLINQ, 'levelNodes.Add (child);' также иногда выдает исключение IndexOutOfRangeException с сообщением: «Исходный массив был недостаточно длинным. Проверьте srcIndex и длину, а также нижние границы массива.»
Есть предложения по устранению этой проблемы?
Или, возможно, производительность будет увеличена с помощью импликации List без блокировок? (Как можно поступить об этом?)