间歇容量小于当前大小错误

时间:2012-05-18 10:39:31

标签: c# multithreading

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

我最初写道 (其中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);
        }});
折扣,这将给我一个巨大的列表,它偶尔(但不总是)抛出一个错误&#39;容量小于当前的大小&#39;

对并行库而言是新手我想象我正在做的事情可以更好地执行(ThreadSafe?)任何指针

另外作为第二个问题,我如何计算已完成的i的数量,因为我失序了。 感谢

1 个答案:

答案 0 :(得分:1)

代码中的错误是对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。您不必以这种方式处理同步集合。