Parallel.Für jede Frage

9

Ich verwende eine Parallel.ForEach-Schleife in C # / VS2010, um die Verarbeitung durchzuführen, und ich habe ein paar Fragen.

Zuerst muss ich einen Prozess, der Informationen aus einem Remote-Webdienst extrahieren muss und dann Bilder (GDI) im laufenden Betrieb erstellen.

Ich habe eine Klasse, die die gesamte Funktionalität in ein einzelnes Objekt mit zwei Hauptmethoden Load () und CreateImage () mit allen GDI-Management / WebRequests "blackboxed" in diesem Objekt kapselt.

Ich erstelle dann eine GenericList, die alle Objekte enthält, die verarbeitet werden müssen, und ich wiederhole die Liste mit dem folgenden Code:

%Vor%

Jetzt sind meine Fragen:

  1. In Anbetracht der Tatsache, dass es zehntausend Elemente in der Liste zum Analysieren geben könnte, ist der obige Code der beste Weg, dies zu erreichen? Irgendwelche anderen Ideen mehr als willkommen
  2. Ich habe ein Problem, bei dem die Objekte beim Start des Prozesses erstellt / geladen und Bilder sehr schnell erstellt werden, aber nach etwa sechshundert Objekten beginnt der Prozess zu krabbeln. Es endet schließlich nicht, ist das normal?

Vielen Dank im Voraus :) Adam

    
user758136 17.05.2011, 21:03
quelle

2 Antworten

4

Ich bin nicht sicher, ob das parallele Herunterladen von Daten eine gute Idee ist, da es viele Threads blockieren wird. Teilen Sie Ihre Aufgabe stattdessen in einen Produzenten und einen Konsumenten auf. Dann können Sie jede davon einzeln parallelisieren.

Hier ein Beispiel für einen einzelnen Produzenten und mehrere Konsumenten.
(Wenn die Verbraucher schneller als der Produzent sind, können Sie einfach eine normale foreach statt parallel.ForEach verwenden)

%Vor%

(Die GetConsumingPartitioner-Erweiterung ist Teil der ParallelExtensionsExtras )

Bearbeiten Ein vollständigeres Beispiel

%Vor%

Mit diesem Code können Sie die Anzahl der parallelen Downloads optimieren, während die CPU mit der Bildverarbeitung beschäftigt bleibt.

    
adrianm 17.05.2011, 21:57
quelle
1

Die Methode Parallel.ForEach mit den Standardeinstellungen funktioniert am besten, wenn die Arbeit, die der Schleifenkörper ausführt, CPU-gebunden ist. Wenn Sie die Arbeit synchron an eine andere Partei blockieren oder weiterleiten, denkt der Scheduler, dass die CPU immer noch nicht beschäftigt ist, und packt immer mehr Aufgaben, wobei er sich bemüht, alle CPUs im System zu verwenden.

In Ihrem Fall müssen Sie nur eine vernünftige Anzahl von überlappenden Downloads auswählen, die parallel auftreten und diesen Wert in Ihren ForEach -Optionen setzen, weil Sie die CPUs nicht mit Ihrer Schleife sättigen werden.

    
Rick Sladkey 17.05.2011 21:37
quelle