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

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

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

У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но суть в другом. Мне надо по очереди их скачать. Причём надо чтобы отображался ход загрузки каждого по отдельности. Мне это представляется так — в цикле foreach по очереди берётся каждый итем и из него достаются имя файла и ссылка. По этой ссылке и имени качается файл в определённое место на диске. И после того как этот файл скачался, цикл продолжается и переходит к следующему итему. Я пользуюсь webClient с асинхронной загрузкой. И проблема заключается в том, что когда загрузка файла началась, то цикл продолжает идти дальше. А мне бы надо, чтобы цикл ждал до тех пор, пока не произойдёт событие окончания загрузки и лишь тогда продолжил свою работу. Для теста я создал простенькую программку, где всего одно скачивание, но после скачивания должно запуститься сообщение в MessageBox.
        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. Прошу отнестись с пониманием, так как тема событий и потоков для меня как для новичка пока расплывчата.

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

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

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


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

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

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