这是有问题的代码:
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 中留下空引用。我怀疑这是由于线程锁定造成的,因为如果调用普通(非并行)ForEach 代替 ForAll,问题就会消失。
使用 PLINQ 实现,'levelNodes.Add(child);' 有时还会抛出 IndexOutOfRangeException 消息:“源数组不够长。检查 srcIndex 和长度,以及数组的下限。”
有什么建议可以消除这个问题吗?
或者使用无锁列表实现可能会提高性能?(怎么可能呢?)