关于Thread.Foreach执行的困惑 - 缺少命中C#

时间:2011-12-30 10:46:03

标签: c# task-parallel-library parallel.foreach

我试图找出为什么我写的并行代码错过了我试图并行搜索的某些字符串。

这就是我所拥有的 - StringCollection是一个字典。键是哈希值,值是一些字符串。总共有四个字典需要搜索。 - InputStrings []是一个字符串数组,准确地说是10,我需要搜索。

在我的代码中我有

Paralle.Foreach(InputStrings,currentString =>
{
  int key = some hashing function on currentString;
  if(SearchCollection(key))// boolean result
   {
     Console.WriteLine("Found:"+key);
   }
   else 
   {
    Console.WriteLine("Not Found:"+key);
  }
});

执行此操作后,我会找到8或9个键,并保持丢失一个或两个键。我知道该集合包含我要搜索的所有密钥。 搜索的密钥在函数内被修改,以便在某些条件下进行进一步搜索。这是关键被修改并传递到一些子字典进行搜索。

我提出的要点是;

这是否意味着线程在完成之前正在退出? 我是否需要将锁定放在我的SearchCollection方法或我的SearchCollection方法中? 由于我对所有线程使用单个集合,TPL是否负责锁定,或者它是否会复制我试图搜索的集合本身?

非常感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:1)

您的SearchCollection和/或您的哈希码似乎不是线程安全的。

通常使用集合只读形式多个线程是安全的,但它取决于实现。

您没有提供足够的详细信息来进一步分析。