foreach和Parallel.ForEach之间的结果不同

时间:2019-12-25 18:17:12

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

我正在尝试使用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个条目。

有人可以解释或检查错误在哪里吗?

2 个答案:

答案 0 :(得分:1)

我找到了答案。使用

    SynchronizedCollection<FileInfo> 

代替

    List<FileInfo> 

是我帮忙的。

答案 1 :(得分:0)

您有两个竞争条件,一个在i++上,一个在ReadFileIntoList读入的任何列表上。对于第一个,使用Interlocked.Increment(ref i)。对于第二个,使用ConcurrentBag<FileInfo>-因为您不关心文件的顺序(如果您使用的是Parallel.Foreach,则它们将是性能最高的集合)。< / p>