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

标签 c#

我正在构建一个复制文件和文件夹的工作应用程序,还有一些选项,但在本期中没有使用这些选项。

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

该应用程序是一个 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 个文件之间有明显的一秒左右的停顿。

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

enter image description here

最佳答案

您的工作主要是 IO 绑定(bind),而不是 CPU 绑定(bind)。大部分时间您没有任何工作需要 CPU 完成。您只是在等待硬盘驱动器 工作。 CPU 中的尖峰只是磁盘完成操作后的短时间段,在此期间 CPU 试图弄清楚下一步要做什么,这需要很少的时间,因此您看到尖峰而不是平稳状态的原因。

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

相关文章:

c# - 如何在asp.net mvc4中发送电子邮件

c# - 在 xamarin forms pcl 上执行查询时没有这样的表 sqlite

c# - 使用 as 关键字与 C# 中的泛型类型冲突的编译时行为

c# - 在 c# 方法中获取堆栈跟踪

c# - LINQ 查询在不可为 null 的字段上返回 null

c# - XElement.Value 正在从内容中剥离 XML 标签

java - 用 Java 编码的 SHA1 从相同的 C# 代码中产生不同的结果

c# - 类型 'foo.Phyl.DSpeed' 已经定义了一个名为 'DSpeed' 的成员,具有相同的参数类型

c# - 获取字符串中所有字符的数值

c# - 将 32 位浮点音频转换为 16 位字节数组?