問題のコードは次のとおりです。
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);
});
});
実行時に、そのコードはlevelNodesにnull参照を残すことがあります。ForAllの代わりに通常の(非並列の)ForEachが呼び出されると問題が解消されるため、これはスレッドロックが原因であると思われます。
PLINQの実装では、'levelNodes.Add(child);' また、「ソース配列の長さが十分ではありませんでした。srcIndexと長さ、および配列の下限を確認してください。」というメッセージとともにIndexOutOfRangeExceptionがスローされることもあります。
この問題を解消するための提案はありますか?
それとも、ロックフリーのリストを実装することでパフォーマンスが向上するでしょうか?(これについてはどうすればよいでしょうか?)