线程混乱。Foreach执行-缺少命中C#
我试图找出为什么我编写的并行代码在我试图并行搜索的某些字符串上漏掉了 这是我的 -StringCollection是一本字典。键是散列,值是字符串。总共有四本字典需要搜索。 -InputStrings[]是一个字符串数组,确切地说是10,我需要搜索它 在我的代码中,我有线程混乱。Foreach执行-缺少命中C#,c#,task-parallel-library,parallel.foreach,C#,Task Parallel Library,Parallel.foreach,我试图找出为什么我编写的并行代码在我试图并行搜索的某些字符串上漏掉了 这是我的 -StringCollection是一本字典。键是散列,值是字符串。总共有四本字典需要搜索。 -InputStrings[]是一个字符串数组,确切地说是10,我需要搜索它 在我的代码中,我有 Paralle.Foreach(InputStrings,currentString => { int key = some hashing function on currentString; if(Search
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是负责锁定还是复制我试图搜索的集合本身
非常感谢您的帮助。
谢谢您的
搜索集合
和/或您的哈希代码似乎不是线程安全的
通常,从多个线程使用集合只读是安全的,但这取决于实现
您没有提供足够的详细信息来进一步分析此问题 没有找到的“缺少一个键”mes是打印出来的,还是只有不到10行的输出?事实上,在放入else之前,我得到的输出更少,也就是说,我得到了8或9个输出,所以我认为我应该放入else,它现在告诉我没有找到键。这仍然很奇怪。我非常确定所有的钥匙都在那里。然后我们需要关于SearchCollection方法的更多信息。它可能不是线程安全的。好吧,SearchCollection确实在某种条件下修改了里面的密钥。所以这意味着我需要在它上面或方法内部设置一些锁?也许。SearchCollection()有什么作用,有副作用吗?散列也一样。它搜索一组字典,一旦在其中找不到,就会修改密钥并将其传递到下一个字典以获取搜索提示:首先使用普通的
foreach()
。我先这样做,然后转向并行版本。