Это действительно динамический параллелизм задач. Ваш код просматривает URL-адреса, которые у вас есть, и выполняет тело для каждого URL-адреса. Он также добавляет любые новые URL-адреса в очередь, используя addMethod и параллельную очередь.
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;
}
}
Таким образом, «петля» разомкнута и будет продолжаться до тех пор, пока вы не закончите работу. Очевидно, что ваше реальное приложение будет учитывать дублирующиеся URL-адреса, а не добавлять их и т. Д. Но это позволяет вашему приложению динамически добавлять работу. Вы можете использовать ParallelOptions для ограничения параллелизма или написать планировщик.
Подробнее о параллелизме динамических задач см.
http://msdn.microsoft.com/en-us/library/ff963551.aspx
Полный код для примера см.
http://parallelpatterns.codeplex.com/SourceControl/changeset/view/54510#795590
В обоих вышеперечисленных обсуждаются другие альтернативные варианты этой темы.
Если вы хотите, чтобы пользовательский планировщик ограничивал степень параллелизма, см. Пример на MSDN
http://msdn.microsoft.com/en-us/library/ee789351.aspx