Скачивание файлов по очереди с прогресс баром - 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;