Скачивание файлов по очереди с прогресс баром - 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д