Ich habe eine asynchrone Parallel.ForEach () -Schleife, mit der ich einige Webseiten herunterlade. Meine Bandbreite ist begrenzt, so dass ich nur x Seiten pro Zeit herunterladen kann, aber Parallel.ForEach führt eine ganze 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, sodass kreative Webcrawling-Lösungen nicht helfen.
c#
.net
asynchronous
parallel.foreach
eugeneK
quelle
quelle
Antworten:
Sie können a
MaxDegreeOfParallelism
in einemParallelOptions
Parameter angeben :MSDN: Parallel.ForEach
MSDN: ParallelOptions.MaxDegreeOfParallelism
quelle
var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) };
-1
dem, dass er überhaupt nicht angegeben wird: "Wenn [der Wert] -1 ist, gibt es keine Begrenzung für die Anzahl der gleichzeitig ausgeführten Vorgänge."var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) };
. Link zu Threads gegen Kerne - askubuntu.com/questions/668538/…Sie können ParallelOptions verwenden und MaxDegreeOfParallelism festlegen, um die Anzahl gleichzeitiger Threads zu begrenzen:
quelle
Verwenden Sie eine andere Überladung
Parallel.Foreach
, die eineParallelOptions
Instanz benötigt, und legen Sie festMaxDegreeOfParallelism
, wie viele Instanzen parallel ausgeführt werden sollen.quelle
Und für die VB.net-Benutzer (Syntax ist seltsam und schwer zu finden) ...
quelle