2013-01-17 6 views
5

nur einige Ratschläge ich 100.000+ XML-Datei in ein anderes System zu verarbeiten und zu bewegen haben.Verarbeiten von Dateien mit ParallelForeach. Ist dies der beste Ansatz

Das Konzept ist ziemlich einfach Ich habe eine Schleife wie:

public void ProcessFiles() 
    { 
     IEnumerable<FileInfo> orderedFiles = GetFilesOrdered(); 

     foreach (FileInfo file in orderedFiles) 
     { 
      ProcessFile(file); 
     } 
    } 

Ich habe über Task Parallel Library zu lesen, aber nicht so zuversichtlich. Nicht sehr aufgeklebt auf Threading. Es scheint, dass TPL viel für mich verpackt.

Um es ist es einfach nur ein Fall von Parallel.ForEach mit?

jede Probe oder Anregungen

+0

Hallo, für die Thread-Sicherheit, besser, um sicherzustellen, dass keiner dieser Dateien gleichzeitig zugegriffen werden kann. –

+0

@ Joe.wang Danke meinst du eine Sperre hinzufügen? Wenn nicht, könntest du mir ein Snippet zur Verfügung stellen? Danke für deine Zeit – user9969

+0

Für was ist die Variable 'index'? Du scheinst es nicht zu benutzen. – Bridge

Antwort

0

Ja, es könnte so einfach sein wie foreach mit Parallel.ForEach ersetzen.

Man muss bedenken, dass mehrere Threads jetzt ProcessFile werden die Ausführung gleichzeitig würde.

Also, wenn Sie in diesem Verfahren in jedem freigegebenen Zustand schreiben, müssen Sie die Synchronisierung zu schützen verwenden konstruiert.

Wenn Sie Multi-Threading neu sind, gibt es eine große Einführungs ebook Sie hier lesen sollten: Albahari

+4

Ein weiterer Gedanke: Parallelität Hinzufügen hier macht nur dann Sinn, wenn der IO derzeit nicht der Flaschenhals –

+0

@NicholasButler ist, wie Sie dann Rennbedingungen mit paralleler Bibliothek vermeiden Sie? Verwenden Sie eine Sperre – user9969

+0

@ user231465 Das ist ein großes Thema. Ich schlage vor, Sie lesen Joe Albaharis E-Book. Sie müssen alles darin verstehen, wenn Sie gleichzeitigen Code korrekt schreiben. –

0

Hoffe, dass es hilfreich ist Ihnen überlassen. Einfaches Snippet, um zu demonstrieren, wie die Datei parallel verschoben wird.

 List<FileInfo> files = new List<FileInfo>(); 
     files.Add(new FileInfo("F:\\1.xml")); 
     files.Add(new FileInfo("F:\\2.xml")); 
     files.Add(new FileInfo("F:\\3.xml")); 



     Parallel.ForEach(files, f => 
     { 
      f.MoveTo("d:\\test\\" + f.Name); 
     }); 
Verwandte Themen