it-swarm.com.de

Wie kann ich Parallel.ForEach einschränken?

Ich habe eine asynchrone Parallel.ForEach () -Schleife, mit der ich einige Webseiten herunterlade. Meine Bandbreite ist begrenzt, sodass ich nur x Seiten pro Zeit herunterladen kann, aber Parallel.ForEach führt die gesamte Liste der gewünschten Webseiten aus.

Gibt es eine Möglichkeit, die Thread-Nummer oder einen anderen Begrenzer zu begrenzen, während Parallel.ForEach ausgeführt wird?

Demo Code:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});

Die eigentliche Aufgabe hat nichts mit Webseiten zu tun, daher helfen kreative Web-Crawling-Lösungen nicht weiter.

269
eugeneK

Sie können einen MaxDegreeOfParallelism in einem ParallelOptions Parameter angeben:

Parallel.ForEach(
    listOfWebpages,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    webpage => { Download(webpage); }
);

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

516
Nicholas Butler

Sie können ParallelOptions verwenden und MaxDegreeOfParallelism festlegen, um die Anzahl der gleichzeitigen Threads zu begrenzen:

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});     
38
rikitikitik

Verwenden Sie eine andere Überladung von Parallel.Foreach, der eine ParallelOptions -Instanz benötigt, und MaxDegreeOfParallelism festlegen, um zu begrenzen, wie viele Instanzen gleichzeitig ausgeführt werden.

21
Richard

Und für die VB.net-Benutzer (Syntax ist seltsam und schwer zu finden) ...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)  
11
user3496060