2016-03-21 30 views
2

嗨我正在使用多線程將多個文件從源複製到多個網絡目標,每個線程將大量文件複製到不同的網絡! 我使用.NET File.Copy(...) 我看到100%的使用上只有一個網絡,每一個時刻C#File.Copy到多個網絡目的地塊其他線程

enter image description here

來自網絡的100%變化至網絡。

  1. 我試圖目的地更改爲本地一個,然後我看到平衡字節拷貝過來的所有主題

  2. 我試圖運行10個進程(每一個到不同的目的地),而不是10線程,那麼我可以100%使用全部10個網絡。

我使用.net 4.5 有什麼想法嗎?

+1

你能提供任何代碼嗎? – icbytes

+0

它真的只是File.Copy,目的地是網絡之一(\\ 10.161.1.1 \ ...) – user5287071

+1

你肯定似乎有錯誤編碼產卵你的線程,正如你在開始時提到的,100次使用是每個一次一個網絡。 – icbytes

回答

-1

您是否考慮過異步操作? MSDN關於特定的異步IO有一些非常好的文檔。

還有一些關於堆棧溢出異步IO的問題,如this one

使用Task.Run可以異步地將所有文件複製操作排隊。

+0

downvoter可以解釋downvote的原因嗎? – Louis

-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:\以符合您的多個目的地。如果您提供原始代碼,我們可以做更多。

0

我建議你用異步/等待模型替換線程(適用於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將大部分是免費的。