Member 11649479 Ответов: 1

Нужно сообщить о прогрессе с помощью webclient


Приложение загружает несколько файлов асинхронно, поэтому, когда я ввожу 10 ссылок в список, 10 файлов начинают загружаться. Я хотел динамически создавать индикаторы выполнения для каждого файла и сообщать о ходе выполнения. Это то, что я использую для отчета о прогрессе
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(worker_ProgressChanged);
но это не работает.
Когда я это сделаю
worker.ReportProgress(10);

это работает, но im может сообщить только целое число, а не клиент.Скачать progresschanged.
Мой вопрос заключается в том, как мне прикрепить клиента.Загрузите progresschanged в мой класс worker_ProgressChanged.

Что я уже пробовал:

private void backgroundWorker1_DoWork(отправитель объекта, DoWorkEventArgs e)
{


Список<строка> В списке "мой список" = (Список<строка> В)электронная.Аргумент;

по каждому элементу(строка йо в мой список)
{
Прогрессбар бар = новый прогрессбар();
позиция += 30;
бар.Ширина = 300;

бар.Location = новая точка(300, позиция);

Invoke(new ToDoDelegate (() = & gt; bar.Location = новая точка(150, позиция)));
Invoke(new ToDoDelegate (() = & gt; this.Управления.Добавить (бар)));
Вызвать(новый ToDoDelegate(() =&ГТ; бар.Видимое = истинное));


WebClient client = новый WebClient();

строке filename = йо.Подстрока(йо.LastIndexOf("/") + 1, (йо.Длина - йо.LastIndexOf("/") - 1));
клиент.DownloadFileAsync(новый Uri (yo), "C:\\Test4\\" + имя файла);

клиент.DownloadProgressChanged += новый DownloadProgressChangedEventHandler(worker_ProgressChanged);


// (отправитель как BackgroundWorker).ReportProgress ((клиент.DownloadFileAsync (новый Uri (yo), имя файла)));
работник.ReportProgress(10);
}

}

частная worker_ProgressChanged недействительным(объект отправителя, ProgressChangedEventArgs е)
{


Ящик для сообщений.Шоу ("я докладываю");
}

1 Ответов

Рейтинг:
2

Sujith Karivelil

Следующий код поможет вам:

WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
webClient.QueryString.Add("file", localFilePath); // To identify the file 
webClient.DownloadFileAsync("URL here", localFilePath);


И webClient_DownloadProgressChanged событие будет выглядеть следующим образом:

void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    string fileProcessed = ((System.Net.WebClient)(sender)).QueryString["file"]; // Getting the local path if required       
    var RecevedBytes = e.BytesReceived;
    var TotalBytes = e.TotalBytesToReceive;
    // use these variables if needed
    bar.Value = e.ProgressPercentage;        

}


Member 11649479

Суджит, к сожалению, не работает. Он прыгает прямо к DownloadFIleCompleter, даже ничего не скачивая, не давая мне никаких ошибок.
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{

ВАР urlInks = список listbox1.Предметы.Cast< string> (). ToList();

Список<строка> В списке "мой список" = (Список<строка> В)urlInks;
строка localFilePath = "C:\\Test4\\";
Веб-клиент веб-клиент = новый Вебклиент();
служба WebClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
служба WebClient.DownloadProgressChanged += новый DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
// Для идентификации файла

служба WebClient.QueryString. Add("file", localFilePath);
служба WebClient.DownloadFileAsync(новый Uri("http://ligman.me/29ngkYn"), localFilePath);

}


общественного недействительными webClient_DownloadProgressChanged(объект отправителя, DownloadProgressChangedEventArgs е)
{
Ящик для сообщений.Показать ("Отчет О Прогрессе");
// строки fileProcessed = ((система.Нет.Вебклиент)(отправителю)).QueryString ["file"]; / / получение локального пути при необходимости
ВАР RecevedBytes = е.BytesReceived;
var TotalBytes = e. TotalBytesToReceive;
// используйте эти переменные, если это необходимо
progressBar1.Значение = e.ProgressPercentage;

}