Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 23.07.2016
Сообщений: 34

Скачивание нескольких файлов по очереди WebClient

02.08.2016, 02:37. Показов 3317. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, передо мной стояла задача скачать около 2000 файлов по ссылкам.
Я заранее подготовил файл вида: "ссылка | название.zip", состоящий из 2000 строк.
Если просто делать через wc.DownloadFileAsync (а именно он мне и нужен, чтобы работать с progressbar'ом), то создается 2000 файлов сразу и, если нужно было остановить поток, то часть оставалась размером "0 байт" - пустыми.
На форуме нашел подходящий для меня код - Как скачивать несколько файлов через WebClient по очереди, через DownloadFileAsync
А именно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void button4_Click(object sender, EventArgs e)
        {
            StreamReader sr = new StreamReader("output.txt");
            string[] kk;
            string link = null, title = null;
            Dictionary<Uri, string> dict = new Dictionary<Uri, string>();
            while (!sr.EndOfStream)
            {
                kk = sr.ReadLine().Split('|');
                link = kk[1].Substring(1, kk[1].Length - 1);
                title = kk[0].Substring(0, kk[0].Length - 1);
                dict.Add(new Uri(link), "C:/Users/nstwf/Desktop/Icons/" + title + ".zip");
            }
            sr.Close();
            DownloadManyFiles(dict);
        }
 
        public async Task DownloadManyFiles(Dictionary<Uri, string> files)
        {
            WebClient wc = new WebClient();
            wc.DownloadProgressChanged += (s, e) => progressBar1.Value = e.ProgressPercentage;
            foreach (KeyValuePair<Uri, string> pair in files)
            {
                await wc.DownloadFileTaskAsync(pair.Key, pair.Value);
            }
            wc.Dispose();
        }
Но на 15 строке получаю предупреждение:
Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Попробуйте применить оператор await к результату вызова.
Подскажите, как исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2016, 02:37
Ответы с готовыми решениями:

WebClient скачивание нескольких файлов с общим прогресс баром
Ребят, использую WebClient, нужно реализовать скачивание двух-трёх файлов и сделать вывод процесса в виде общего прогресс бара. Подскажите...

Скачивание файлов с использованием WebClient
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Скачивание нескольких файлов
Доброго времени суток!!! Нужно скачать по очереди несколько файлов по http, как это реализовать?

5
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
02.08.2016, 02:46
Рекомендую сначала разобраться с однопоточным скачиванием, затем создать класс например WebClient и запустить его в разных потоках.
0
0 / 0 / 1
Регистрация: 23.07.2016
Сообщений: 34
02.08.2016, 02:50  [ТС]
Можно исправить так, но очень некрасиво смотрится, есть ли другие варианты?
C#
1
2
3
#pragma warning disable CS4014 // Так как этот вызов не ожидается, выполнение существующего метода продолжается до завершения вызова
            DownloadManyFiles(dict);
#pragma warning restore CS4014 // Так как этот вызов не ожидается, выполнение существующего метода продолжается до завершения вызова
Добавлено через 2 минуты
DataPlanner, спасибо, но есть ли другие варианты как убрать 1 предупреждение, нежели создавать класс?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
02.08.2016, 02:53
Цитата Сообщение от hmfkofbi Посмотреть сообщение
нежели создавать класс
Разумеется, любую задачу нужно разделять на подзадачи до нулевой дискретности.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
02.08.2016, 10:01
Цитата Сообщение от hmfkofbi Посмотреть сообщение
Если просто делать через wc.DownloadFileAsync (а именно он мне и нужен, чтобы работать с progressbar'ом)
Большая ошибка подгонять базовый функционал программы под пользовательский интерфейс. Интерфейсы часто меняются, если вы завтра решите отказаться от прогресс-бара, вы будете из-за этого всю программу переделывать?
Цитата Сообщение от hmfkofbi Посмотреть сообщение
Здравствуйте, передо мной стояла задача скачать около 2000 файлов по ссылкам.
Создайте очередь из ваших ссылок ConcurrentQueue<Link>. Затем создайте несколько потоков, в каждом из них - берите в цикле из очереди ссылку, пока очередь не пуста, и скачивайте файл через WebClient. Псевдокод потока:
C#
1
2
3
4
5
6
while(очередь не пуста) 
{
   взять из очереди ссылку
   создать файл
   скачать файл через WebClient
}
Обновление прогресс бара можно сделать по таймеру. Прогресс можно определить по числу оставшихся элементов в очереди (ну или завести счетчик скачанных файлов).
0
 Аватар для FeddeLeGrand
29 / 29 / 18
Регистрация: 09.03.2016
Сообщений: 198
02.08.2016, 18:30
hmfkofbi, если изначально известен путь для каждого файла, то можно делать так:
C#
1
2
3
4
WebClient wc = new WebClient();
wc.DownloadFile(url1, path1);
wc.DownloadFile(url2, path2);
wc.DownloadFile(url3, path3);
Файлы будут загружаться по очереди.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2016, 18:30
Помогаю со студенческими работами здесь

Скачивание нескольких файлов по очереди DownloadFileTaskAsync
На просторах форума нашёл несколько вариантов, доработав один из них получил: public async Task DownloadManyFiles(Dictionary&lt;Uri,...

Загрузка файлов по очереди используя WebClient
Есть List&lt;string&gt; в котором ссылки на скачку файлов. Циклом прохожу по каждой ссылке и загружаю файл используя WebClient. Проблема в том,...

Пакетное скачивание нескольких папок с сервера по очереди
Не могу правильно сформулировать вопрос. Значится так: Имеется скачивальщик POPOLN.CMD. Чтобы выкачать папку с сервера надо в командной...

Скачивание файлов по очереди с прогресс баром
У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но суть в другом. Мне надо по очереди их...

Скачивание нескольких файлов
Сейчас моя задача в том чтобы создать функцию загрузки файлов по списку с отображением в прогресс бар, и далее обрабатывать эти файлы. Вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru