似乎没有MinDegreeOfParallelism。以下代码似乎只使用1%的cpu,所以我怀疑它没有正确使用核心:
Parallel.ForEach(lls, new ParallelOptions { MaxDegreeOfParallelism = 10 }, GetFileSizeFSO);
有没有办法使用10个核/线程FORCE?
其他信息:
private void GetFileSizeFSO(List<string> l)
{
foreach (var dir in l)
{
var ds = GetDirectorySize3(dir);
Interlocked.Add(ref _size, ds);
}
}
public static long GetDirectorySize3(string parentDirectory)
{
Scripting.FileSystemObject fso = new Scripting.FileSystemObject();
Scripting.Folder folder = fso.GetFolder(parentDirectory);
Int64 dirSize = (Int64)folder.Size;
Marshal.ReleaseComObject(fso);
return dirSize;
}
答案 0 :(得分:2)
您的功能GetFileSizeFSO
有何功能?如果它访问光盘上的文件,那必须是你的主要时间消费者。处理器太快,光盘无法赶上处理器。因此处理器有足够的时间来备用并等待硬盘完成它的工作。
如果您需要优化代码,最好比尝试100%加载处理器更有效地访问文件。
答案 1 :(得分:2)
它被称为MaxDegreeOfParallelism
,而不是MinDegreeOfParallelism
。 Parallel
是为CPU绑定工作而设计的 - 使用更多线程与使用CPU相比没有任何意义。听起来你的工作受I / O限制,而不是CPU限制,所以Parallel
根本不适合这项工作。
理想情况下,找到一个异步API来执行您尝试执行的操作 - 这是使用您拥有的资源的最佳方式。如果没有异步API,则必须自己生成这些线程 - 但不要期望看到CPU使用率。最重要的是, measure - 很可能并行化工作负载根本不会提高吞吐量(例如,I / O可能已经饱和)。
答案 2 :(得分:0)
简单的答案是 - 你做不到。
但你为什么要这样? .NET非常擅长选择最佳线程数量。 MaxDegreeOfParallelism
的使用是限制并行性,而不是强制它,例如,如果您不想将所有系统资源都提供给循环。
作为旁注,从您的函数名称GetFileSizeFSO
判断,我猜它会从您的持久存储中读取文件大小,这可以解释为什么您的CPU没有被完全使用。
答案 3 :(得分:0)
ManInMoon,您的CPU使用率可能很慢,因为您正在进行的工作可能受到存储机制的限制。击中同一个硬盘以获取文件大小的10个核心可能不会比2个核心更快,因为对于硬盘驱动器来说,与你周围的C#逻辑相比(相当荒谬)更昂贵的操作。
所以,你没有并行问题,你有I / O问题。
旁注,或许不使用FSO,请改用.NET FileInfo。