Parallel.ForEach循环与For循环不同的结果

时间:2018-10-03 23:10:24

标签: c# asynchronous async-await parallel.foreach

使用Parallel.ForEach循环而不是foreach循环时,我得到了一些我不理解的结果。我浏览了搜索中的回复,但大部分是求和。

以下是每个代码的有效代码:

    public async Task<List<Folder>> GetFoldersAsync()
    {
        List<Folder> folderList = new List<Folder>();
        List<string> Drives = await GetDrivesAsync();
        List<Task<string[]>> tasks = new List<Task<string[]>>();
        List<Task> addTasks = new List<Task>();
        foreach (string Drive in Drives)
        {
            tasks.Add(Task.Run(() => Directory.GetDirectories(Drive)));
        }

        var driveResults = await Task.WhenAll(tasks);

        foreach (var DirList in driveResults)
        {
            foreach (var Dir in DirList)
            {
                folderList.Add(new Folder(GetParentDirectory(Dir), GetFolderName(Dir)));
            }
        }

        return folderList;
    }

for foreach循环。这将在文件夹列表中显示1130。但是,当我更改第二个foreach循环中的任何一个(下面的代码)时,我得到的结果是随机数(通常为null),并且我知道我缺少有关Parallel.ForEach循环工作方式的信息,但我不知道什么。旁注:我是使用Parallel.ForEach和async / await的新手。

CodeBlock ParallelForEach循环1(有时返回正确的结果,大部分返回的结果更少)

            public async Task<List<Folder>> GetFoldersAsync()
    {
        List<Folder> folderList = new List<Folder>();
        List<string> Drives = await GetDrivesAsync();
        List<Task<string[]>> tasks = new List<Task<string[]>>();
        List<Task> addTasks = new List<Task>();
        foreach (string Drive in Drives)
        {
            tasks.Add(Task.Run(() => Directory.GetDirectories(Drive)));
        }

        var driveResults = await Task.WhenAll(tasks);

        Parallel.ForEach(driveResults, (DirList) =>
        {
            foreach (var Dir in DirList)
            {
                folderList.Add(new Folder(GetParentDirectory(Dir), GetFolderName(Dir)));
            }
        });

        return folderList;
    }

CodeBlock Parallel.ForEach循环2(有时返回正确,大部分返回较少)

    public async Task<List<Folder>> GetFoldersAsync()
    {
        List<Folder> folderList = new List<Folder>();
        List<string> Drives = await GetDrivesAsync();
        List<Task<string[]>> tasks = new List<Task<string[]>>();
        List<Task> addTasks = new List<Task>();
        foreach (string Drive in Drives)
        {
            tasks.Add(Task.Run(() => Directory.GetDirectories(Drive)));
        }

        var driveResults = await Task.WhenAll(tasks);

        foreach (var DirList in driveResults)
        {
            Parallel.ForEach(DirList, (Dir) =>
            {
                folderList.Add(new Folder(GetParentDirectory(Dir), GetFolderName(Dir)));
            });
        }

        return folderList;
    }

我真的很想找出我在哪里出错了。最终,我试图在正在使用异步/等待的MVVM框架中使用此方法,这是目的,但我对缺乏知识的地方更感兴趣,因此我可以很好地掌握它-这个结果是微不足道的,因为我可以只使用标准的foreach循环。感谢您提供的任何指导。

0 个答案:

没有答案