我的任务是扫描所有文件夹名称以“xyz”开头并行。我的意思是,如果一个文件夹同时扫描,其他人也应该扫描。我不想一个接一个扫描。
为此,我使用了Parallel Foreach。
问题是? 它是否正确?如何知道它是否并行运行(将任何消息放在哪里)?
Parallel.ForEach(path, currentPath =>
{
var output = programReader.GetData(currentPath, durReader.dirPattern);
foreach (var item in output)
{
foreach (var project in item.Name)
Console.WriteLine(item.serverName + " " + item.serverNumber + " " + fileName);
}
}
修改
Parallel.Foreach仅适用于多核系统,或者它可以在单核系统上运行以执行显示并行性
答案 0 :(得分:3)
渴望 - 如果你提出问题,请提出问题。 !这是一个很好的迹象,这不是一个问题。
其次,你的方法毫无意义。并行将非常平行。好。不好:你还有一张光盘。结果:任务等待。在硬件支持的程度上对IO操作进行并列化是没有意义的。
答案 1 :(得分:1)
并行扩展分割了每个核心的负载 - 尽管我不确定它们是否考虑了超线程核心。
但是,要添加另一个答案,引导你朝着正确的方向前进:
请勿尝试并行执行此操作。磁盘一次只能处理一个请求,因此您可能只是放慢速度,因为磁盘队列可能会变大。
您可能能够提高性能的唯一方案是,您扫描的位置实际上是存储分布和高度复制的SAN。
答案 2 :(得分:0)
您可以打印Thread.ManagedThreadId值以查看正在使用的线程。
答案 3 :(得分:0)
Parallel.ForEach或Parallel.Execute使用处理器的核心。因此,如果您的处理器拥有更多的核心,那么它们将同样用于运行此线程。你在这里