Скачивание файлов по очереди с прогресс баром - C#
Формулировка задачи:
У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но суть в другом. Мне надо по очереди их скачать. Причём надо чтобы отображался ход загрузки каждого по отдельности. Мне это представляется так — в цикле foreach по очереди берётся каждый итем и из него достаются имя файла и ссылка. По этой ссылке и имени качается файл в определённое место на диске. И после того как этот файл скачался, цикл продолжается и переходит к следующему итему.
Я пользуюсь webClient с асинхронной загрузкой. И проблема заключается в том, что когда загрузка файла началась, то цикл продолжает идти дальше. А мне бы надо, чтобы цикл ждал до тех пор, пока не произойдёт событие окончания загрузки и лишь тогда продолжил свою работу.
Для теста я создал простенькую программку, где всего одно скачивание, но после скачивания должно запуститься сообщение в MessageBox.
Но у меня после того как я нажимаю кнопку и загрузка файла только начинается, сразу же выскакивает мой MessageBox. А как сделать, чтобы он ждал?
P.S. Наличие MessageBox лишь условное, он здесь пока как замена продолжения цикла foreeach.
P.P.S. Прошу отнестись с пониманием, так как тема событий и потоков для меня как для новичка пока расплывчата.
Листинг программы
- 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 = "Загрузка завершена.";
- }
Решение задачи: «Скачивание файлов по очереди с прогресс баром»
textual
Листинг программы
- Task<string> task = new WebClient().DownloadStringTaskAsync("http://microsoft.com/");
- task.Wait(); // Здесь мы ждем завершения задачи, что блокирует поток
- TextBox.Text = task.Result;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д