2017-12-15 4 views
0

Ich habe ein Array, das einige Textdateien Pfad ist. Ich möchte diese Pfade in einen anderen Ordner kopieren. um einen Thread zum Beispiel in 6 Sekunden ausführen. Denkst du, dass wenn ich zum Beispiel 4 Threads verwende, kann es optimiert werden oder nicht? und wie kann ich das tun?
Ich möchte dieses Array zu 4 Segmenten trennen und jeder Thread seinen Segmentpfad kopieren. Es ist mein Code, der zuerst * .txt-Dateien im speziellen Verzeichnis sucht und dann alle in einen anderen Ordner kopiert.wie ein Array zu 4 Segment zu trennen und es von 4 Thread

string format = "*.txt"; 
string directory = lblDirectory.Text; 
// it's path of first folder that i search text file in it 
DirectoryInfo info = new DirectoryInfo(directory); 
if ((info.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden) 
{ 
    Thread t; 
    string[] files = Directory.GetFiles(directory, format, 
       SearchOption.AllDirectories); 
    foreach (var item in files) 
    { 
     streamWriter.Write(Path.GetFullPath(item) + "\r\n"); 
     File.Copy(Path.GetFullPath(item), Path.Combine(index, 
     Path.GetFileName(item)), true); 
    } 
} 
+0

Check out https://docs.microsoft.com/en -us/dotnet/standard/parallel-programmierung/wie-schreibe-eine-einfach-parallel-foreach-schleife. – mjwills

+2

Wenn die Ordner alle auf einem Laufwerk sind und es keine SSD ist, hör auf, über Parallelisierung nachzudenken, afaik normale Festplatten funktionieren nicht parallel. Ihre Threads warten auf einander oder warten darauf, dass das Laufwerk die anderen Jobs beendet. –

Antwort

3

Ich schlage vor, mit Parallel Linq (PLINQ) und lassen Sie .Net spaltete die Arbeit für Sie, so etwas wie dieses:

Directory 
    .EnumerateFiles(directory, format, SearchOption.AllDirectories) 
    .AsParallel() 
    .WithDegreeOfParallelism(4) 
    .ForAll(item => { 
     //TODO: be sure that streamWriter.Write is thread safe! 
     streamWriter.Write(Path.GetFullPath(item) + "\r\n"); 

     File.Copy(Path.GetFullPath(item), 
       Path.Combine(index, Path.GetFileName(item)), 
       true); 
    }); 
Verwandte Themen