Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的Parallel.Foreach与并行执行#_C#_Parallel Processing_Multitasking - Fatal编程技术网

C# C语言中的Parallel.Foreach与并行执行#

C# C语言中的Parallel.Foreach与并行执行#,c#,parallel-processing,multitasking,C#,Parallel Processing,Multitasking,我有一个任务,扫描所有文件夹名称开始与“xyz”并行。我的意思是,如果一个文件夹得到扫描的同时,另一个也应该得到扫描。我不想逐个扫描 为此,我使用了并行Foreach 问题是什么? 对不对?如何知道它是并行运行的(将任何消息放在哪里) 编辑: 是并行的。Foreach只能在多核系统上工作,也可以在单核系统上工作,以执行“显示并行性”您可以打印Thread.ManagedThreadId值以查看正在使用哪些线程。首先-如果您提出问题,请将其作为一个问题!!这是一个很好的迹象,表明这不是一个问题 其

我有一个任务,扫描所有文件夹名称开始与“xyz”并行。我的意思是,如果一个文件夹得到扫描的同时,另一个也应该得到扫描。我不想逐个扫描

为此,我使用了并行Foreach

问题是什么? 对不对?如何知道它是并行运行的(将任何消息放在哪里)

编辑:


是并行的。Foreach只能在多核系统上工作,也可以在单核系统上工作,以执行“显示并行性”

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

首先-如果您提出问题,请将其作为一个问题!!这是一个很好的迹象,表明这不是一个问题


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

Parallel.ForEach或Parallel.Execute使用处理器的核心。因此,如果您的处理器在一个内核上有多个线程,它们将被平等地用于运行该线程。这里是m

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

但是,要添加另一个答案来引导您走向正确的方向:

不要试图同时做这件事。磁盘一次只能处理一个请求,因此,由于磁盘队列可能会变得越来越大,您很可能会放慢速度


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

由于这是I/O绑定的,因此并行运行可能会更慢。确保你计算出结果的时间。哦!!谢谢你的指点。我做了一些改变。我怀疑
并行
是否会在不同的处理器上分配任务。我怎么知道每个路径的文件夹都在并行扫描。我完全糊涂了。再说一次,处理器的数量是无关紧要的。您的光盘速度不够快,无法同时处理多个请求。即使是一个处理器,甚至10岁,也会太快。除非有大型SAN或SSD可用,否则无法高效并行化磁盘IO。哦。。。所以你想说,这种并行在一个核心系统中不起作用。那么我应该如何对目录进行并行扫描呢?不,我想这与您试图从处理器中获得多大的性能无关。在本例中,您的限制因素不是处理器,而是光盘。你在这里要做的是制造一辆一级方程式赛车,jsut会发现你需要运输一台10吨重的机器。不合适。目录信息分析主要受光盘速度的限制。哦,是的!!这是一种方式。让我试试。
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);
        }
     }