Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 19
1

Скачивание файлов по очереди с прогресс баром

07.02.2016, 19:10. Показов 3833. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но суть в другом. Мне надо по очереди их скачать. Причём надо чтобы отображался ход загрузки каждого по отдельности. Мне это представляется так — в цикле foreach по очереди берётся каждый итем и из него достаются имя файла и ссылка. По этой ссылке и имени качается файл в определённое место на диске. И после того как этот файл скачался, цикл продолжается и переходит к следующему итему.

Я пользуюсь webClient с асинхронной загрузкой. И проблема заключается в том, что когда загрузка файла началась, то цикл продолжает идти дальше. А мне бы надо, чтобы цикл ждал до тех пор, пока не произойдёт событие окончания загрузки и лишь тогда продолжил свою работу.

Для теста я создал простенькую программку, где всего одно скачивание, но после скачивания должно запуститься сообщение в MessageBox.

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
28
29
30
31
32
        private void button1_Click(object sender, EventArgs e)
        {
            string url = "https://dl.dropboxusercontent.com/u/29604742/temp/testload/" + 1 + ".PNG";
            string place = "C:/Users/Bro/Desktop/" + 1 + ".PNG";
 
            Download(url,place);
            MessageBox.Show("Complette");
        }
 
 
        private void Download(string url, string place)
        {
            using (WebClient wClient = new WebClient())
            {
                Uri link = new Uri(url);
                wClient.DownloadFileAsync(link, place);
                wClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
                wClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
            }
        }
 
 
        public void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            textBox1.Text = Convert.ToString(progressBar1.Value) + " %";
        }
 
        public void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            textBox1.Text = "Загрузка завершена.";
        }
Но у меня после того как я нажимаю кнопку и загрузка файла только начинается, сразу же выскакивает мой MessageBox. А как сделать, чтобы он ждал?

P.S. Наличие MessageBox лишь условное, он здесь пока как замена продолжения цикла foreeach.

P.P.S. Прошу отнестись с пониманием, так как тема событий и потоков для меня как для новичка пока расплывчата.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2016, 19:10
Ответы с готовыми решениями:

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

Скачивание файлов из интернета с прогресс-баром при использовании indy
Доброго времени суток, участники и гости форума. В моей программе мне нужно реализовать скачивание...

Переименование файлов с прогресс баром
Есть код, который переименовывает файлы находящиеся в папке любых расширений в порядке возрастания...

Отправка/получение файлов на FTP с прогресс баром
Добрый день всем! перерыл кучу ресурсов (в том числе) и этот. Но ничего (рабоающего) не нашел....

8
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,660
Записей в блоге: 14
07.02.2016, 19:33 2
Вы точно не хотите сделать параллельную загрузку? Пример такого можно подглядеть в браузерах, очень наглядно.

Добавлено через 2 минуты
В текущей постановке задачи можно просигналить в autoresetevent, который будет ожидаться перед MessageBox.
1
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 19
07.02.2016, 19:35  [ТС] 3
Дело в том, что это будет программа, которая скачивает сериалы с сайта. Т.е. файлы примерно по 50-60 метров, если в сериале 20 серий, то сразу 20 серий качать будет долго, поэтому желательно, чтобы первые серии скачивались вначале.

Добавлено через 1 минуту
В текущей постановке задачи можно просигналить в autoresetevent, который будет ожидаться перед MessageBox.
А подробнее как это сделать? Т.е. он будет ждать, пока не закончится загрузка файла?
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,660
Записей в блоге: 14
07.02.2016, 19:41 4
Логично.
Тогда можно просто утилите wget скормить файл со списком адресов.

Подробнее:
Объект класса ManualResetEvent, ManualResetEventSlim или AutoResetEvent.
У него есть метод ожидания факта установки сигнала. Сигнал установите по факту окончания загрузки файла.
Но в таком коде GUI будет подвисать до завершения всего.
Лучше передать весь этот список в отдельный поток, где и закачку асинхронно запускать, и ожидать завершения каждого файла (как выше). Асинхронно - чтобы можно было отменить загрузку, если понадобится прервать работу.

Почитайте Шилдта, главы 23 и 24: Литература по C# для начинающих и не только
1
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 19
07.02.2016, 19:51  [ТС] 5
Тогда можно просто утилите wget скормить файл со списком адресов.
Мне же надо чтобы прогресс отображался в моей программе. Я так понимаю это консольная утилита.

Но в таком коде GUI будет подвисать до завершения всего.
Думаю, пока это не страшно) Главное чтобы прогресс бар не подвисал.

Лучше передать весь этот список в отдельный поток, где и закачку асинхронно запускать, и ожидать завершения каждого файла (как выше). Асинхронно - чтобы можно было отменить загрузку, если понадобится прервать работу.
Как с потоками разберусь получше, тогда попробую такой способ. Для меня пока это сложновато.

Спасибо за помощь. Буду разбираться с AutoResetEvent.
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,660
Записей в блоге: 14
07.02.2016, 20:03 6
Цитата Сообщение от cheerful_weasel Посмотреть сообщение
Думаю, пока это не страшно) Главное чтобы прогресс бар не подвисал.
Прогрессбар именно к GUI и относится. Так что сразу переходите к потокам.
1
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 19
07.02.2016, 20:30  [ТС] 7
Прогрессбар именно к GUI и относится. Так что сразу переходите к потокам.
ааааа... блин. Тогда придётся пока почитать книжки.

Добавлено через 9 минут
Я вот тут нагуглил. Поможет ли это?
C#
1
2
3
  Task<string> task = new WebClient().DownloadStringTaskAsync("http://microsoft.com/");
  task.Wait(); // Здесь мы ждем завершения задачи, что блокирует поток
  TextBox.Text = task.Result;
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,660
Записей в блоге: 14
07.02.2016, 20:34 8
Не поможет, пока не усвоите всю инфу по порядку из книг. С кашей в голове получится каша в коде.
Надо вот что:
Собрать список файлов в массив строк или иных классов;
* Передать в функцию загрузки, работающую в потоке;
* По очереди
* * брать файл из очереди;
* * запускать скачку;
* * ожидать сигнала;
* * по завершению скачки выставлять сигнал;
* * закрывать файл;
* * брать следующий файл.

Причём отображение прогресса из потока скачки в поток GUI надо проводить только подходящими средствами синхронизации. Иначе программу заглючит.
1
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 19
07.02.2016, 20:37  [ТС] 9
Ок, понял
0
07.02.2016, 20:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2016, 20:37
Помогаю со студенческими работами здесь

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

Вывести скачивание файлов в отдельный поток и отобразить прогресс в ProgressBar'е
Добрый всем день. Хочу вывести скачивание файлов в отдельный поток и отобразить прогресс в...

Проблемы со прогресс баром
Нашел в интернете вот такой скрипт прогресс бар. При нажатие на кнопку появляется вверху бар...

Ребят подскажите с прогресс баром
Мне нужно чтобы при полном запонении прогресс бара вылетало сообщение и прогресс бар обнулялся. И...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru