Как быстро скачать множество картинок в многопотоке?

165
02 декабря 2021, 19:30

Делал сперва скачивание через 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 - и оно очень долгое время висит, нагружает проц и ничего не скачивает.

Подскажите что не так? Мб использовать другой вариант многопоточного скачивания файлов?

READ ALSO
Как имитировать ЗАЖАТИЕ кнопки на клавиатуре вне формы

Как имитировать ЗАЖАТИЕ кнопки на клавиатуре вне формы

В одном из методов требуется зажатие определённой клавиши, пока верно условиеЯ использую голосовое управление в программе

156
Постоянная загрузка индекса IntelliSense

Постоянная загрузка индекса IntelliSense

Обратил внимание, что при старте проекта Win FormsNet framework все фоновые задачи успешно выполняются и заканчиваются, в то время как одна постоянно...

68
Как наиболее правильней и корректней вернуть более одного значения в методе? С#

Как наиболее правильней и корректней вернуть более одного значения в методе? С#

Мне надо чтоб метод вернул четыре значения один bool, один string и два floatЯ делаю это с помощью Dictionary<bool, string> Но Dictionary мне кажется создан для...

189
Микрофризы при ожидание коннекта по tcp в IEnumerator-е

Микрофризы при ожидание коннекта по tcp в IEnumerator-е

Ожидаю подключение к tcp данным кодом:

175