Делал сперва скачивание через Parallel.For
Parallel.For(0, images.Count(), new ParallelOptions { MaxDegreeOfParallelism = 10}, async (o) =>
{
new WebClient().DownloadFile...
});
Скорость мне не понравилась. Попробовал такой вариант
var tasks = new List<Task>();
Parallel.For(0, images.Count(), new ParallelOptions { MaxDegreeOfParallelism = 1}, async (o) =>
{
var f = path + GetFileName(images[o]);
tasks.Add(NewDownload(images[o], f));
});
await Task.WhenAll(tasks.ToArray());
async static Task NewDownload(string hrefLink, string filename)
{
Axi:
try
{
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(hrefLink))
using (System.Net.Http.HttpContent content = response.Content)
{
if (!File.Exists(filename))
{
using (var fs = new FileStream(filename, FileMode.CreateNew))
{
await response.Content.CopyToAsync(fs);
}
}
}
}
catch (Exception)
{
Thread.Sleep(1000);
goto Axi;
}
}
Когда tasks было штук 40-50 всё работало очень даже быстро, но щас у меня 20k tasks - и оно очень долгое время висит, нагружает проц и ничего не скачивает.
Подскажите что не так? Мб использовать другой вариант многопоточного скачивания файлов?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости