Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

реализация поочередных http потоков

29K
26 октября 2008 года
Daniel Lavrushin
30 / / 26.10.2008
Друзья, помогите реализовать идею на С#.

Есть listview контрол, который отображает файлы, хранимы на сервере. Когда человек выделяет эти файлы и жмет клавишу Скачать, то необходимо запустить процессы скачки, причем хотелось бы запускать их поочередно.
Есть также прогрессбар, который отображает скачаную информацию для каждого файла.
Проблема в том, что файлы начинают скачиваться, как только пробегает весь цикл listview.selecteditems, вместо того, чтобы начинать следующий процесс после закачки предыдущего. Соотвественно прогрессбар срабатывает только на первый файл, на остальные же - просто молчит.

У меня пока получилось запускать их все, пробегаясь по списку listview.selecteditems.

вот код, который вызывает процессы скачки
 
Код:
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);
                   
}



а вот сам процесс 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();

                }
   }



В обще-то вопрос простой: как сделать так, чтобы процесс закачки начинался поочередно по завершении предыдущего скачивания файла и прогрессбар срабатывал бы снова?
5
26 октября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Daniel Lavrushin

Проблема в том, что файлы начинают скачиваться, как только пробегает весь цикл listview.selecteditems, вместо того, чтобы начинать следующий процесс после закачки предыдущего.

Дык оно и понятно - в цикле создается столько потоков, сколько файлов выделено.
В вашем случае проще было бы передать список файлов в поток скачивания, а уж он бы обрабатывал не один файл - а список их.

29K
26 октября 2008 года
Daniel Lavrushin
30 / / 26.10.2008
спасибо, все получилось =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог