1

我正在尝试对大量实体执行迭代,以查看它们的匹配程度

我最初写的(其中 MatchData 是结构列表 & GenerateMatch 对两个实体执行操作)

for (int i = 0; i < count; i++)
  {
      for (int j = i + 1; j < count; j++)
      {
       MatchData.Add(GenerateMatch(i, j));
       Console.WriteLine("Stage :" + i + " ::: " + j);
      }
  }

效果很好,但速度很慢

所以我把它改成

Parallel.For(0, count, i =>
  {
   for (int j = i + 1; j < count; j++){
        MatchData.Add(GenerateMatch(i, j));
        Console.WriteLine("Stage :" + i + " ::: " + j);
        }});

考虑到这会给我一个巨大的列表,它偶尔(但不总是)会引发错误“容量小于当前大小”

作为并行库的新手,我想我正在做的事情可以更好地执行(ThreadSafe?)任何指针

作为次要问题,我如何计算已完成的 i 数量,因为 i 出现故障。谢谢

4

1 回答 1

2

您的代码中的错误是对 MatchData 的并发访问。可能的解决方案:

var matches =
from i in ParallelEnumerable.Range(0, count)
from j in ParallelEnumerable.Range(i+1, count - (i+1))
select GenerateMatch(i, j);

只需使用 PLINQ。您不必以这种方式处理同步集合。

于 2012-05-18T11:03:01.643 回答