我正在构建一个用于复制文件和文件夹的应用程序,还有一些选项,但在此问题期间未使用这些选项。

有问题的函数遍历目录中的每个文件,然后将文件复制到相同目录的新位置(因此它保留嵌套的文件结构)。

该应用程序是一个 Windows 窗体,由于同时写入文本框的问题,我在 Task.Factory.StartNew() 中包围了并行函数,它解决了该问题。

Task.Factory.StartNew(() =>
{
    Parallel.ForEach(Directory.GetFiles(root, "*.*", SearchOption.AllDirectories), newPath =>
    {
        try
        {
            File.Copy(newPath, newPath.Replace(root, destination), false);
            WriteToOutput("recreated the file '" + newPath.Replace(root, destination) + "'");
         }
         catch (Exception e)
         {
             WriteToOutput(e.Message);
         }
     });
});

运行时,诊断工具每隔几秒就会显示一次峰值。我怎样才能“平衡”这些峰值并使性能保持一致?我还在为每个移动的文件写入屏幕,并且在每 20/25 个文件之间有明显的一秒左右的停顿。

下面的屏幕截图是来自诊断工具的示例。

c# - CPU 和内存峰值,在 Parallel.ForEach 期间-LMLPHP

最佳答案

您的工作主要受 IO 限制,而不是 CPU 限制。大多数情况下,CPU 没有任何工作要做。您只是在等待硬盘驱动器完成其工作。 CPU 中的尖峰只是磁盘完成操作后的一小段时间,此时 CPU 试图弄清楚接下来要做什么,这需要很少的时间,因此您会看到尖峰,而不是平稳期。

关于c# - CPU 和内存峰值,在 Parallel.ForEach 期间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49077864/

10-17 01:02