我正在尝试使用Parallel.ForEach通过以下代码遍历整个文件目录:
List<string> _files = Directory.EnumerateFiles(baseDirectory, "*", SearchOption.AllDirectories).ToList();
Parallel.ForEach(_files, (file) => { ReadFileIntoList(file); i++; });
_files包含28015个条目,但是执行后,我只有27944个,结果列表也仅包含27944个条目。
但是,如果我使用以下代码:
List<string> _files = Directory.EnumerateFiles(baseDirectory, "*", SearchOption.AllDirectories).ToList();
foreach (string file in _files)
{
ReadFileIntoList(file);
i++;
}
我也将是28015,并且结果列表中还将包含28015个条目。
有人可以解释或检查错误在哪里吗?
答案 0 :(得分:1)
我找到了答案。使用
SynchronizedCollection<FileInfo>
代替
List<FileInfo>
是我帮忙的。
答案 1 :(得分:0)
您有两个竞争条件,一个在i++
上,一个在ReadFileIntoList
读入的任何列表上。对于第一个,使用Interlocked.Increment(ref i)
。对于第二个,使用ConcurrentBag<FileInfo>
-因为您不关心文件的顺序(如果您使用的是Parallel.Foreach
,则它们将是性能最高的集合)。< / p>