foreach (ListViewItem item in listView1.SelectedItems)
{
Thread thrfile = new Thread(Download);
thrfile.Name = "DownloadFile" + item.Index.ToString();
thrfile.Start(item.Text);
item.ForeColor = Color.FromArgb(176, 71, 163);
}
реализация поочередных http потоков
Есть listview контрол, который отображает файлы, хранимы на сервере. Когда человек выделяет эти файлы и жмет клавишу Скачать, то необходимо запустить процессы скачки, причем хотелось бы запускать их поочередно.
Есть также прогрессбар, который отображает скачаную информацию для каждого файла.
Проблема в том, что файлы начинают скачиваться, как только пробегает весь цикл listview.selecteditems, вместо того, чтобы начинать следующий процесс после закачки предыдущего. Соотвественно прогрессбар срабатывает только на первый файл, на остальные же - просто молчит.
У меня пока получилось запускать их все, пробегаясь по списку listview.selecteditems.
вот код, который вызывает процессы скачки
Код:
а вот сам процесс Download
Код:
private void Download(object fn)
{
using (WebClient wcDownload = new WebClient())
{
string filename = (string)fn;
string from = "url/" + filename;
string to = "local path\\" + filename;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(from);
webRequest.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Int64 fileSize = webResponse.ContentLength;
wcDownload.Credentials = CredentialCache.DefaultCredentials;
Stream strResponse = wcDownload.OpenRead(from);
Stream strLocal = new FileStream(to, FileMode.Create, FileAccess.Write, FileShare.None);
int bytesSize = 0;
byte[] downBuffer = new byte[4096];
while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
{
strLocal.Write(downBuffer, 0, bytesSize);
// ОБНОВЛЯЕМ ПРОГРЕССБАР
this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize, filename, 0 });
}
strResponse.Close();
strLocal.Close();
}
}
{
using (WebClient wcDownload = new WebClient())
{
string filename = (string)fn;
string from = "url/" + filename;
string to = "local path\\" + filename;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(from);
webRequest.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Int64 fileSize = webResponse.ContentLength;
wcDownload.Credentials = CredentialCache.DefaultCredentials;
Stream strResponse = wcDownload.OpenRead(from);
Stream strLocal = new FileStream(to, FileMode.Create, FileAccess.Write, FileShare.None);
int bytesSize = 0;
byte[] downBuffer = new byte[4096];
while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
{
strLocal.Write(downBuffer, 0, bytesSize);
// ОБНОВЛЯЕМ ПРОГРЕССБАР
this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize, filename, 0 });
}
strResponse.Close();
strLocal.Close();
}
}
В обще-то вопрос простой: как сделать так, чтобы процесс закачки начинался поочередно по завершении предыдущего скачивания файла и прогрессбар срабатывал бы снова?
Цитата: Daniel Lavrushin
Проблема в том, что файлы начинают скачиваться, как только пробегает весь цикл listview.selecteditems, вместо того, чтобы начинать следующий процесс после закачки предыдущего.
Дык оно и понятно - в цикле создается столько потоков, сколько файлов выделено.
В вашем случае проще было бы передать список файлов в поток скачивания, а уж он бы обрабатывал не один файл - а список их.
спасибо, все получилось =)