Вы можете использовать pfx (http://www.albahari.com/threading/part5.aspx),, тогда вы можете контролировать, сколько потоков создать для извлечения, и с помощью PLINQ я нахожу полезным.
Итак, вы перебираете список URL-адресов, возможно, читаете из файла или базы данных, а затем в своем выборе вы можете вызвать функцию для выполнения обработки.
Если вы можете более подробно рассказать, например, хотите ли вы, чтобы выборка и обработка выполнялись в разных потоках, может быть проще дать более полный ответ.
UPDATE:
Вот как я бы подошел к этому, но я также использую ConcurrentQueue
(http://www.codethinked.com/net-40-and-system_collections_concurrent_concurrentqueue), поэтому я могу помещать данные в очередь во время чтения из нее.
Таким образом, каждый поток может безопасно удалить из очереди, не беспокоясь о необходимости блокировки вашей коллекции.
Parallel.For(0, queue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 20 },
(j) =>
{
String i;
queue.TryDequeue(out i);
// call out to URL
// process data
}
});
Возможно, вы захотите поместить данные в другой параллельный сбор и обрабатывать их отдельно, это зависит от потребностей вашего приложения.