Dies ist wirklich dynamische Aufgabenparallelität. Ihr Code durchläuft die URLs, die Sie haben, und führt den Body für jede URL aus. Es fügt auch alle neuen URLs in die Warteschlange mit einer addMethod und eine gleichzeitige Warteschlange.
public static void ParallelWhileNotEmpty<T>(
IEnumerable<T> initialValues,
Action<T, Action<T>> body)
{
var opts = new ParallelOptions { MaxDegreeOfParallelism = 10 };
var from = new ConcurrentQueue<T>(initialValues);
while (!from.IsEmpty)
{
var to = new ConcurrentQueue<T>();
Action<T> addMethod = to.Enqueue;
Parallel.ForEach(from, opts. body(v, addMethod));
from = to;
}
}
Auf diese Weise ist die "Schleife" unbegrenzt und wird fortgesetzt, bis Sie keine Arbeit mehr haben. Natürlich würde Ihre echte Anwendung doppelte URLs berücksichtigen und sie nicht hinzufügen usw. Aber dies ermöglicht Ihrer Anwendung, dynamisch Arbeit hinzuzufügen. Sie können die ParallelOptions verwenden, um die Gleichzeitigkeit zu begrenzen, oder Sie können einen Scheduler schreiben.
Weitere Informationen zur dynamischen Aufgabenparallelität finden Sie unter
http://msdn.microsoft.com/en-us/library/ff963551.aspx
Den vollständigen Code für das Beispiel finden Sie unter
http://parallelpatterns.codeplex.com/SourceControl/changeset/view/54510#795590
In den beiden oben genannten Beiträgen werden weitere alternative Varianten dieses Themas erörtert.
Wenn Sie einen benutzerdefinierten Planer wünschen, um den Grad der Parallelität zu begrenzen, sehen Sie sich das Beispiel auf MSDN an
http://msdn.microsoft.com/en-us/library/ee789351.aspx