/// <summary> /// Процедура, для создания прогресс-баров /// </summary> /// <param name="mode">Режим. 1-создание и добавление, 2-удаление</param> /// <param name="httpObject">Объект HTTP</param> public void Watcher(int mode, HttpObject httpObject) { this.BeginInvoke((MethodInvoker)delegate { /*Добавление прогресс бара для данного HTTP-объекта*/ if (mode == 1) { //Создаю новый груп-бокс GroupBox gb = new GroupBox(); //Выставляю ему размер чуть меньше, чем контейнер gb.Size = new Size(flowLayoutPanel1.Width - 5, 25); //Выделяем память и инициализируем место для прогресс-бара httpObject.progressBar = new ProgressBar(); //Задаем имя прогресс бара (имя - уникальный идентификатор GUID, который не повторяется) httpObject.progressBar.Name = httpObject.guid.ToString(); //Задаем минимум и максимум для прогресс бара /*Так как выполнение отображается в процентах, диапазон от 0 до 100*/ httpObject.progressBar.Minimum = 0; httpObject.progressBar.Maximum = 100; //Добавляем данный прогресс бар внутрь групбокса gb.Controls.Add(httpObject.progressBar); //Выставляем режим "Заполнять все пространство" для прогресс-бара httpObject.progressBar.Dock = DockStyle.Fill; //Выставляем текст груп-бокса имя скачиваемого файла gb.Text = httpObject.Name; //Добавляем данную конструкцию в контейнер flowLayoutPanel1.Controls.Add(gb); } /*Удаление прогресс бара для данного HTTP-объекта*/ if (mode == 2) { //Создаем ссылку на прогресс-бар с указанным именем ProgressBar pb = (ProgressBar)flowLayoutPanel1.Controls.Find(httpObject.guid.ToString(), true)[0]; //Удаляем родительский груп-бокс из контейнера (удаляется вместе с прогресс-баром) pb.Parent.Dispose(); //Удаляем данный HTTP - элемент из данной коллекции httpLinks.Remove(httpObject); } }); }
/// <summary> /// Обработчик события "Изменен статус загрузки файла" /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <param name="httpObject"></param> void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e, HttpObject httpObject) { this.BeginInvoke((MethodInvoker)delegate { //Вычисляем процент загрузки файла double bytesIn = double.Parse(e.BytesReceived.ToString()); double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); double percentage = bytesIn / totalBytes * 100; //Проставляем процент для прогресс-бара httpObject.progressBar.Value = (int)Math.Truncate(percentage); }); }
/// <summary> /// Асинхронная загрузка файла /// </summary> /// <param name="link"></param> private void DownloadHttpFile(HttpObject link) { //Создаем новый экземпляр клиента, чтобы потоки не ругались друг на друга client = new WebClient(); //Добавляем для данного клиента обработчики собыытий "Изменен статус загрузки файла" и "Загрузка файла окончена" client.DownloadProgressChanged += (sender, e) => client_DownloadProgressChanged(sender, e, link); client.DownloadFileCompleted += (sender,e) => client_DownloadFileCompleted(sender,e,link); //Запускаем загрузку в асинхронном режиме client.DownloadFileAsync(link.Url, Path.Combine(link.pathToSave, link.Name)); }
/// <summary> /// Обработчик события "Загрузка файла окончена" /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <param name="link"></param> void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e,HttpObject link) { this.BeginInvoke((MethodInvoker)delegate { //Удаляем прогресс бар, отвечающий за данный файл Watcher(2, link); }); }