Посмотрите на TPL, есть возможность указать максимальный параллелизм:
List<string> UriList = new List<string>();
...
Parallel.ForEach(UriList,
new ParallelOptions() {MaxDegreeOfParallelism=10},
(x) =>
{
ProcessUrl(x);
});
Это будет обрабатывать не более 10 URL параллельно, поскольку мы используем перегрузку Parallel.Foreach()
, которая позволяет нам указать MaxDegreeOfParallelism
.
Изменить:
Вот простой пример, который загружает Html из http://google.com 50 раз параллельно (но не более 10 одновременно) и сохраняет результаты в массиве:
List<string> UriList = new List<string>();
for(int i =0;i<50;i++)
UriList.Add("http://google.com");
string[] HtmlResults = new string[UriList.Count];
Parallel.ForEach(UriList,
new ParallelOptions() { MaxDegreeOfParallelism = 10 },
(url, i, j) =>
{
WebClient wc = new WebClient();
HtmlResults[j] = wc.DownloadString(url);
});
Не для того, чтобы создавать больше путаницы, но в вашем конкретном случае PLINQ также будет работать очень хорошо, поскольку нет никаких зависимостей между элементом для обработки, и у вас есть фактический результат, что URL-адрес "преобразуется" в :
var htmlResultList = UriList.AsParallel()
.WithDegreeOfParallelism(10)
.AsOrdered()
.Select(url => { WebClient wc = new WebClient(); return wc.DownloadString(url); })
.ToList();