我正在构建一个用于复制文件和文件夹的应用程序,还有一些选项,但在此问题期间未使用这些选项。
有问题的函数遍历目录中的每个文件,然后将文件复制到相同目录的新位置(因此它保留嵌套的文件结构)。
该应用程序是一个 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 个文件之间有明显的一秒左右的停顿。
下面的屏幕截图是来自诊断工具的示例。
最佳答案
您的工作主要受 IO 限制,而不是 CPU 限制。大多数情况下,CPU 没有任何工作要做。您只是在等待硬盘驱动器完成其工作。 CPU 中的尖峰只是磁盘完成操作后的一小段时间,此时 CPU 试图弄清楚接下来要做什么,这需要很少的时间,因此您会看到尖峰,而不是平稳期。
关于c# - CPU 和内存峰值,在 Parallel.ForEach 期间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49077864/