2016-03-21 6 views
2

Hallo Ich benutze Multithread, um viele Dateien von einem Quell- zu Multi-Netzwerk-Ziele zu kopieren, jeder Thread einen Großteil der Dateien in anderen Netzwerk kopieren! Ich verwende .net File.Copy (...) Ich sehe 100% verwendet auf nur ein Netzwerk, jeden MomentC# Datei.Kopieren zu mehreren Netzwerk-Ziel blockieren andere Threads

enter image description here

die 100% ige Veränderung von Netzwerk zu Netzwerk.

  1. ich versuchte, die Ziele zu lokalen ein zu ändern, dann i ausgeglichen Bytes kopieren über alle Threads siehe

  2. I 10 Prozesse auszuführen versucht (jeweils zu einem anderen Ziel) anstelle von 10-Gewinde, dann bekomme ich alle 10 netzwerk bei 100% nutzen.

Ich benutze .net 4.5 irgendeine Idee?

+1

Können Sie einen beliebigen Code bereitstellen? – icbytes

+0

ist es wirklich nur File.Copy, das Ziel ist Netzwerk eins (\\ 10.161.1.1 \ ...) – user5287071

+1

Sie scheinen sicherlich Buggy Codierung beim Laichen Ihrer Threads zu haben, wie Sie am Anfang erwähnen, die 100-Nutzung ist nur per ein Netzwerk nach dem anderen. – icbytes

Antwort

-1

Haben Sie sich die asynchronen Operationen angesehen. Es gibt einige wirklich gute Dokumentationen über MSDN über speziell Async IO.

Es gibt auch einige Fragen über async IO auf Stapelüberlauf wie this one.

Mit Task.Run können Sie alle Ihre Dateikopiervorgänge asynchron in eine Warteschlange stellen.

+0

Kann der Downvoter die Gründe für den Downvote erklären? – Louis

-1

Versuchen Sie so etwas wie:

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]); 
    } 
    ); 

ändern c: \ Ihre verschiedenen Reisezielen übereinstimmen. Wenn Sie den ursprünglichen Code angeben, könnten wir mehr tun.

0

Ich würde vorschlagen, dass Sie Threads ersetzen (gut für CPU-gebundene Operationen) mit async/abwarten-Modell, die für IO gebundene Operationen ausgezeichnet ausführen.

der File.Copy Betrieb neu schreiben lassen als

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

Sie es Methode von Aufruf aufrufen können, wie unten Snippet.

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); 
} 

Jetzt können Sie einfach diese Methode mit src und Zielpfade so schnell wie möglich pumpen. Ihre Begrenzung wird die E/A-Geschwindigkeit (Festplatte/Netzwerk usw.) sein, aber Ihre CPU wird größtenteils frei sein.