【发布时间】:2018-03-03 05:56:45
【问题描述】:
我正在构建一个用于复制文件和文件夹的应用程序,还有一些选项,但在此问题中没有使用这些选项。
有问题的函数遍历目录中的每个文件,然后将文件复制到相同目录的新位置(因此它保留嵌套的文件结构)。
应用程序是一个 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 个文件之间会有一个明显的秒左右的暂停。
以下屏幕截图是来自诊断工具的示例。
【问题讨论】:
-
尝试复制线程效果的一个好方法是使用
robocopy /MT:n功能在一些典型的源驱动器和目标驱动器配置之间复制一组有代表性的数据。我想你会发现n > 2比n == 1快,但是会有一个收益递减点。我的经验是/MT:4过去是一个不错的选择,但对于很多小文件,/MT:8可能会更好。这将为您提供一些线索,您可以应用这些线索来选择您的应用程序应该使用多少线程以及何时使用。也许你想让它可配置?
标签: c#