【问题标题】:intermittent capacity was less than the current size Error间歇性容量小于当前大小错误
【发布时间】:2012-05-18 19:03:01
【问题描述】:

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

我最初写的 (其中 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 出现故障。 谢谢

【问题讨论】:

    标签: c# multithreading


    【解决方案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。您不必以这种方式处理同步集合。

    【讨论】:

      猜你喜欢
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2011-11-26
      • 1970-01-01
      • 2013-01-01
      • 2017-08-12
      • 2021-11-22
      相关资源
      最近更新 更多