KirillHelm
@KirillHelm

Progress Bar & Thread в C#?

Есть поток, в который передаётся функция, необходимо привязать к ней ProgressBar, как это сделать?
Кстати говоря, гуглил, изначально функцию в поток передавал просто закинув её без параметров, но как понадобилось передавать в поток функцию с параметрами, пришлось сразу дописывать '() =>'. С потоками не знаком, приходится использовать так как программа качает файлы из сети и не хочется, что бы она на время висла, может кто объяснит зачем нужно это самое пресловутое '() =>'?
DATA.SubThread = new Thread(() => Downloder.DownloadFile("http://...", "C:\\..."));
  • Вопрос задан
  • 1546 просмотров
Решения вопроса 1
tomnolane
@tomnolane
профессиональный разработчик
Kirill Rud: я не понял что вы в коде подразумеваете под "Downloder"... если это WebClient downloader= new WebClient(); то, у него есть специальный метод для асинхронной загрузки (чтобы не создавать отдельный поток)
// DownloadFile(...) - загрузка в главном потоке
downloader.DownloadFileAsync(new Uri("ввв.сайт.ру"), "C:\\temp.zip"); // - загружает асинхронно в отдельном потоке, т.е. "DATA.SubThread = new Thread(() =>" <- создавать не нужно.

после чего "Downloder" нужно подписать на эвенты (события).. ниже в примере создаётся два события: во время загрузки и по окончанию загрузки:
private void button1_Click(object sender, EventArgs e) //нажимаем кнопку "загрузить"
  {
   string url = "http://****.ру.*****1.zip";
   WebClient downloader = new WebClient();
   downloader.DownloadFileCompleted += new AsyncCompletedEventHandler(downloader_DownloadFileCompleted); // привязываем эвент когда файл загрузится
   downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloader_DownloadProgressChanged); // привязываем эвент когда файл загружается (в процессе)
   downloader.DownloadFileAsync(new Uri(url), "C:\\temp.zip"); // загружаем не блокируя главный поток
  }

 void downloader_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) // событие по которому передается в прогресс бар кол-во процентов загруженной информации
   { 
      progressBar1.Value =  e.ProgressPercentage; // progressBar1 - ваш прогресс бар
    }
  void downloader_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) // событие по окончанию загрузки (п.с. как пример, в рабочем варианте использовать MessageBox лучше не стоит, т.к. он блокирует основной поток (форма зависает, пока не нажмёте кнопку "ок")
   {
       if (e.Error != null)
         MessageBox.Show(e.Error.Message);
       else
         MessageBox.Show("Загружено!!!");
   }

усё вроде...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@John_Nash
coder
анонимный делегат без параметров так записывается через лямбда-выражение
Ответ написан
abyrkov
@abyrkov
JavaScripter
Ну так конструктор Thread принимает функцию, которая вызывается в отдельном потоке. Вы ее создаете.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы