C#File.Copy到多个网络目标阻止其他线程

时间:2016-03-21 12:44:39

标签: c# .net multithreading networking copy

您好我使用多线程将许多文件从源复制到多网络目的地,每个线程将大量文件复制到不同的网络! 我使用.net File.Copy(...) 我看到100%仅在一个网络上使用,每一刻

enter image description here

从网络到网络的100%变化。

  1. 我尝试将目的地更改为本地目的地,然后我看到平衡字节复制到所有线程

  2. 我尝试运行10个进程(每个进程到不同的目标)而不是10个进程,然后我100%使用全部10个进程。

  3. 我使用.net 4.5 任何想法?

3 个答案:

答案 0 :(得分:0)

我建议你用async / await模型替换线程(适用于CPU绑定操作),这对于IO绑定操作来说非常有用。

让我们将File.Copy操作重写为

public static async Task Copy(string src, string dest)
{
    await Task.Run(() => {
        System.IO.File.Copy(src, dest);
    });
}

您可以通过调用方法将其作为下面的代码段进行调用。

var srcPath = "your source location";
var dstPath = "your destination location";

foreach(var file in System.IO.Directory.EnumerateFiles(srcPath))
{
    var dstFile = System.IO.Path.Combine(dstPath, System.IO.Path.GetFileName (file));
    Copy (file, dstFile);
}

现在,您可以尽可能快地使用src和目标路径泵送此方法。您的限制将是IO速度(磁盘/网络等),但您的Cpu将大部分是免费的。

答案 1 :(得分:-1)

您是否考虑过异步操作?关于特定的异步IO,MSDN上有一些非常好的文档。

还有一些关于堆栈溢出的异步IO的问题,例如this one

使用Task.Run,您可以异步排队所有文件复制操作。

答案 2 :(得分:-1)

尝试类似:

    List<String> fileList = new List<string>();
    fileList.Add("TextFile1.txt");
    fileList.Add("TextFile2.txt");

    Parallel.For(0, fileList.Count, x =>
    {
        File.Copy(fileList[x], @"C:\" + fileList[x]);
    }
    );

更改c:\以匹配您的多个目的地。如果您提供原始代码,我们可以做更多。