【问题标题】:C# File.Copy to multiple Network destination block other threads [closed]C# File.Copy 到多个网络目标块其他线程 [关闭]
【发布时间】:2016-03-21 12:44:38
【问题描述】:

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

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

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

  2. 我尝试运行 10 个进程(每个进程到不同的目的地)而不是 10 个线程,然后我得到所有 10 个网络的 100% 使用率。

我使用 .net 4.5 有什么想法吗?

【问题讨论】:

  • 你能提供任何代码吗?
  • 它真的只是 File.Copy ,目的地是网络一(\\10.161.1.1\...)
  • 您在生成线程时肯定似乎有错误的编码,正如您在开始时提到的那样,100 次使用一次仅适用于每个网络。
  • 没有错误,当我使用本地目的地时,写入字节在所有线程之间是平衡的,只有当目的地是网络时才会发生.....
  • 没有内在限制。我们需要查看代码以了解您究竟导致了哪些 IO 模式。 由于您一再拒绝提供代码,我将结束问题。在这种情况下无法为您提供帮助。

标签: c# .net multithreading networking copy


【解决方案1】:

我建议您用异步/等待模型替换线程(适用于 CPU 绑定操作),该模型对 IO 绑定操作执行出色。

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

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

你可以从下面的sn-p调用方法中调用它。

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 将大部分是免费的。

【讨论】:

    【解决方案2】:

    您是否看过异步操作。 MSDN 上有一些关于异步 IO 的非常好的文档。

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

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

    【讨论】:

    • 投反对票的人能否解释一下投反对票的原因?
    【解决方案3】:

    尝试类似:

        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:\ 以匹配您的多个目的地。如果您提供原始代码,我们可以做得更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2012-10-20
      • 2012-04-04
      • 1970-01-01
      相关资源
      最近更新 更多