C#中的Parallel.Foreach和并行执行

时间:2011-02-14 08:32:44

标签: c# parallel-processing multitasking

我的任务是扫描所有文件夹名称以“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仅适用于多核系统,或者它可以在单核系统上运行以执行显示并行性

4 个答案:

答案 0 :(得分:3)

渴望 - 如果你提出问题,请提出问题。 !这是一个很好的迹象,这不是一个问题。

其次,你的方法毫无意义。并行将非常平行。好。不好:你还有一张光盘。结果:任务等待。在硬件支持的程度上对IO操作进行并列化是没有意义的。

答案 1 :(得分:1)

并行扩展分割了每个核心的负载 - 尽管我不确定它们是否考虑了超线程核心。

但是,要添加另一个答案,引导你朝着正确的方向前进:

请勿尝试并行执行此操作。磁盘一次只能处理一个请求,因此您可能只是放慢速度,因为磁盘队列可能会变大。

您可能能够提高性能的唯一方案是,您扫描的位置实际上是存储分布和高度复制的SAN。

答案 2 :(得分:0)

您可以打印Thread.ManagedThreadId值以查看正在使用的线程。

答案 3 :(得分:0)

Parallel.ForEach或Parallel.Execute使用处理器的核心。因此,如果您的处理器拥有更多的核心,那么它们将同样用于运行此线程。你在这里