Это действительно динамический параллелизм задач.Ваш код перебирает все ваши задания и выполняет каждое из них.Каждое задание может добавлять новые задания в использование 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