使用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循环。感谢您提供的任何指导。