用Parallel.ForEach替换Sequential foreach

Kev*_*ith 1 c# parallel-processing

在下文中foreach p : allPersons,很明显(因为逻辑是顺序的)map/Dictionary可用于缓存/ memoization.

Dictionary<string, int> personNameToIdMap = new Dictionary<string, int>();

foreach(p : allPersons)
{

 int outputId;

 if(personNameToIdMap.TryGetValue(p.Name, out outputId))
 {
   // nothing to do since map contained the p.Name
 }
 else
 { 
    outputId = doExpensiveLookup(p.Name);
    personNameToIdMap[p.Name] = outputId;
 }

  ...

  p.Id = outputId;

}
Run Code Online (Sandbox Code Playgroud)

如果我替换上面foreachParallel.ForEach,将每个线程的份额personNameToIdMap

Har*_*san 5

是的,如果Parallel.Foreach每个线程都使用相同的实例Dictionary.

如果你真的想要并行,你可以使用ConcurrentDictionary,它是线程安全的版本Dictionary