【发布时间】:2017-02-07 16:01:27
【问题描述】:
我正在使用 System.Threading.Tasks.Parallel.ForEach()。 出于某种原因,将 MaxDegreeOfParallelism 设置为“-1”甚至“50”,会导致循环运行得更快(大约 15 秒并且它是一致的)。 MaxDegreeOfParallelism 参数的默认值为 -1,将其设置为 50 或任何其他数字只会使其变慢。 可能是什么原因?
System.Collections.Concurrent.ConcurrentBag<FileDataInfo> filesData = new System.Collections.Concurrent.ConcurrentBag<FileDataInfo>();
System.Threading.Tasks.Parallel.ForEach(filesInfo,
new System.Threading.Tasks.ParallelOptions() { MaxDegreeOfParallelism = -1 },
info =>
{
if (!string.IsNullOrEmpty(info.FolderPath))
info.FolderPath = System.IO.Path.Combine(dataPathDirName, info.FolderPath);
else
info.FolderPath = dataPathDirName;
var storageHandler = FileStorageFactory.CreateStorageHander();
byte[] data = storageHandler.GetFileData(info.FilePath);
filesData.Add(new FileDataInfo() { Info = info, Data = data });
});
【问题讨论】:
-
你的最后一句话和你的第一句话相反。
-
你能改写你的问题吗?一句话说快,下一句说慢。你在问什么?
-
我在您的代码中没有看到昂贵的任务。并行化任务只适用于昂贵的任务,如果你尝试并行化大量的小任务,它可能会对你的性能产生负面影响(或者你可能只会得到一点提升,这不值得你的代码引入复杂性)。
-
@M.kazem Akhgary GetFileData() 是一项昂贵的任务
-
GetFileData听起来像是 I/O 主导的任务。Parallel.ForEach不是一个好的选择 - 它是为 CPU 主导的任务而设计的,理想情况下完全没有 I/O。
标签: c# task-parallel-library parallel.foreach