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

Узнай цену своей работы

Формулировка задачи:

У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но суть в другом. Мне надо по очереди их скачать. Причём надо чтобы отображался ход загрузки каждого по отдельности. Мне это представляется так — в цикле foreach по очереди берётся каждый итем и из него достаются имя файла и ссылка. По этой ссылке и имени качается файл в определённое место на диске. И после того как этот файл скачался, цикл продолжается и переходит к следующему итему. Я пользуюсь webClient с асинхронной загрузкой. И проблема заключается в том, что когда загрузка файла началась, то цикл продолжает идти дальше. А мне бы надо, чтобы цикл ждал до тех пор, пока не произойдёт событие окончания загрузки и лишь тогда продолжил свою работу. Для теста я создал простенькую программку, где всего одно скачивание, но после скачивания должно запуститься сообщение в MessageBox.
Листинг программы
  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. string url = "https://dl.dropboxusercontent.com/u/29604742/temp/testload/" + 1 + ".PNG";
  4. string place = "C:/Users/Bro/Desktop/" + 1 + ".PNG";
  5. Download(url,place);
  6. MessageBox.Show("Complette");
  7. }
  8.  
  9. private void Download(string url, string place)
  10. {
  11. using (WebClient wClient = new WebClient())
  12. {
  13. Uri link = new Uri(url);
  14. wClient.DownloadFileAsync(link, place);
  15. wClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
  16. wClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
  17. }
  18. }
  19.  
  20. public void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
  21. {
  22. progressBar1.Value = e.ProgressPercentage;
  23. textBox1.Text = Convert.ToString(progressBar1.Value) + " %";
  24. }
  25. public void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
  26. {
  27. textBox1.Text = "Загрузка завершена.";
  28. }
Но у меня после того как я нажимаю кнопку и загрузка файла только начинается, сразу же выскакивает мой MessageBox. А как сделать, чтобы он ждал? P.S. Наличие MessageBox лишь условное, он здесь пока как замена продолжения цикла foreeach. P.P.S. Прошу отнестись с пониманием, так как тема событий и потоков для меня как для новичка пока расплывчата.

Решение задачи: «Скачивание файлов по очереди с прогресс баром»

textual
Листинг программы
  1.   Task<string> task = new WebClient().DownloadStringTaskAsync("http://microsoft.com/");
  2.   task.Wait(); // Здесь мы ждем завершения задачи, что блокирует поток
  3.   TextBox.Text = task.Result;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут