Скачать несколько файлов из массива C # - PullRequest
1 голос
/ 22 марта 2010

У меня есть массив имен файлов, которые я хочу загрузить.

Массив в настоящее время содержится в строке [] и работает внутри BackgroundWorker.

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

Есть ли способ, которым я могу это сделать.

Спасибо.

Ответы [ 3 ]

1 голос
/ 22 марта 2010

Используйте WebClient для загрузки файлов, есть метод "DownloadFile".

Псевдокод

foreach(var url in listOfStringURLS)
{
    WebClient.DownloadFile(url, ".");
    updateProgressBar();
}

Это легкая часть! Теперь вам нужно знать, что когда вы используете BackgroundWorker, вы больше не находитесь в GUI-потоке, что означает, что вы не можете обновить ProgressBar без использования Delegate! Проверьте это: " Делегат индикатора выполнения ".

Для .NET 4.0

Возможно, вы захотите распараллелить загрузку! Вы можете легко сделать это с помощью .NET 4.0, заглянув в раздел «Задачи», прочитав этот блог о Paralell Programming . В противном случае, как сказал другой участник, все операции ввода-вывода будут выполняться в 1 потоке, что может быть не так оптимизировано.

1 голос
/ 22 марта 2010

Если вы обрабатываете это у фонового работника, у вас есть 1 поток, выполняющий все ваши операции ввода-вывода.Это нормально, но, возможно, не самое быстрое.

Фоновый работник имеет событие ProgressChanged, метод ReportProgress () и свойство Supportsprogress.

  1. Установите для свойства значение true
  2. Вызовите ReportProgress (в процентах) для DoWork
  3. обработать событие ProgressChanged, чтобы установить индикатор выполнения.
0 голосов
/ 22 марта 2010

Просто используйте: ReportProgress ((100 * currentItem) / list.Count) и позвольте обработчику событий BackgroundWorker.ProgressChanged обновить индикатор выполнения (вам может потребоваться проверить, требуется ли invoke, и использовать invoke для обновления).

Затем обработчик событий ProgressChanged может рассчитать оставшееся время.

Ofc, если размер элементов сильно различается, это не совсем точно.

Возможно, вы захотите посмотреть http://msdn.microsoft.com/en-us/library/system.net.webclient.downloadfileasync.aspx, что устраняет необходимость в отдельном фоновом работнике.

...