none
Вывод процента выполненой операции в BackgroundWorker RRS feed

  • Общие обсуждения

  • Подскажите как вывести процент выполненой операции с помощью ReportProgress... 

    В этой теме работа с потоками с backgroundWorker в C# в 9 сообщении написано, что в ReportProgress...  надо вставить процент выполнения, но я не могу понять от куда мне его взять....

    Если для каждого кода он индивидуальный, то подскажите как мне правильно сделать для моего кода

    FtpClient client = new FtpClient();
    
                //Задаём параметры клиента.
                client.PassiveMode = true; //Включаем пассивный режим.
                string FTP_SERVER = ftp_host.Text;// адерс фтп сервера
                int FTP_PORT = 21;//порт сервера
                string FTP_USER = ftp_user.Text;// Имя пользователя
                string FTP_PASSWORD = ftp_password.Text;// Пароль пользователя
    
                //Подключаемся к FTP серверу.
                client.Connect(30000, FTP_SERVER, FTP_PORT);
                client.Login(30000, FTP_USER, FTP_PASSWORD);
    
                StreamReader lintfilesSErver = new StreamReader(@"D:\import.txt");
                string sLine = "";
    
                ArrayList lintfile = new ArrayList();
    
                while (sLine != null)
                {
                    sLine = lintfilesSErver.ReadLine();
                    if (sLine != null)
                        lintfile.Add(sLine);
                }
                lintfilesSErver.Close();
    
                foreach (string sOutput in lintfile)
                {
                    string correctString = sOutput.Replace("/public_html/", @"D:\OpenServer\domains\qwerty.by/"); // LICENSE.txt
                    string fileName = @"D:\OpenServer\domains\qwerty.by/" + correctString;
    
                    // Создание списка папок
                    string CreateDirectory = Path.GetDirectoryName(correctString);
    
                    // Формированным списком папок...
                    Directory.CreateDirectory(CreateDirectory);
                    // Принимает указанный файл с сервера.
                    client.GetFile(30000, correctString, sOutput);
                }



    13 января 2015 г. 15:05

Все ответы

  • В цикл foreach вставьте _bw.ReportProgress.

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

    И, по крайней мере, замените ArrayList на List<string>.

    13 января 2015 г. 17:07
  • Но как использовать for для моего кода, я особо не знаю...
    13 января 2015 г. 23:22
  • Добрый день.

    Вот так:

                for (int i = 0; i < lintfile.Count; i++)
                {
                    string correctString = sOutput.Replace("/public_html/", @"D:\OpenServer\domains\qwerty.by/"); // LICENSE.txt
                    string fileName = @"D:\OpenServer\domains\qwerty.by/" + correctString;
    
                    // Создание списка папок
                    string CreateDirectory = Path.GetDirectoryName(correctString);
    
                    // Формированным списком папок...
                    Directory.CreateDirectory(CreateDirectory);
                    // Принимает указанный файл с сервера.
                    client.GetFile(30000, correctString, lintfile[i]);
                }

    Собственно отношение i к lintfile.Count и есть процент выполнение.
    14 января 2015 г. 6:03
    Отвечающий
  • перепробовал всякие варианты, но все равно не работает, даже выдает ошибку...

    14 января 2015 г. 9:22
  • Точно, у вас же ArrayList. Вот так напишите:

    client.GetFile(30000, correctString, lintfile[i].ToString());
    14 января 2015 г. 9:27
    Отвечающий
  • оно как сейчас, так и в прошлый раз не выполняет код 

    client.GetFile(30000, correctString, lintfile[i].ToString());

    оно просто заполняет processBar и все... Да еще и с ошибкой...

    я думаю что оно передает число которое получилось в lintfile.Count а оно там не маленькое... 

    Но все равно загрузка файла не работает...

    14 января 2015 г. 9:58
  • Если у вас не работает загрузка, то это другой вопрос и задайте его отдельным топиком. То что падает про 101, это значит, что файлов у вас больше 100, а в ProgressBar у вас в свойство Maximum установлено 100. Присвойте ему перед запуском потока для скачивания lintfile.Count
    14 января 2015 г. 10:01
    Отвечающий
  • Я тут попробывал... и копирование уже работает, 

                Invoke((Action)delegate
                {
                    progressBar1.Maximum = lintfile.Count;
                    progressBar1.Value = 0;
                });
    
                    for (int i = 0; i < lintfile.Count; i++)
                    {
                        string correctString = lintfile[i].ToString().Replace("/public_html/", @"D:\OpenServer\domains\qwerty.by/"); // LICENSE.txt
                        string fileName = @"D:\OpenServer\domains\qwerty.by/" + correctString;
    
                        // Создание списка папок
                        string CreateDirectory = Path.GetDirectoryName(correctString);
    
                        // Формированным списком папок...
                        Directory.CreateDirectory(CreateDirectory);
                        // Принимает указанный файл с сервера.
                        client.GetFile(30000, correctString, lintfile[i].ToString());
    
                        backgroundWorker1.ReportProgress(i);
                    }


    Но не успевают загрузиться все файлы процесс бар уже заполняется...

    Используя 

     progressBar1.Maximum = lintfile.Count;

    я указываю что максимальное значение будет тоже самое что и кол-во файлов...

    Но не может же быть что у меня примерно 6500%

    14 января 2015 г. 10:23
  • Посмотрел исходники FTP клиента, там вроде все методы синхронные. Проблем с несоответствием прогресс бара и закачки быть не должно. А разве на ProgressBar высвечивается 6500%? Но если хотите, то можно и от 1 до 100 получать значения. Оставляете Maximum = 100, и пишите вот так:

    backgroundWorker1.ReportProgress((int)(((float)i)/lintfile.Count));
    

    Вроде в скобках не запутался...
    14 января 2015 г. 10:36
    Отвечающий
  • А разве на ProgressBar высвечивается 6500%?

    Да вот как я вывожу...

     resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
                this.progressBar1.Value = e.ProgressPercentage;
    Все работает кроме, вывода процентов в resultLabel.Text и заполнение процесс бара

    14 января 2015 г. 10:44
  • Сделайте как я написал выше, либо e.ProgressPercentage делите на Maximum из progressBar-а и полученное значение приводите к строке. Только делайте это по той же схеме с приведением к float что я показал.
    14 января 2015 г. 11:07
    Отвечающий
  • На скриншоте у вас цикл for вложен в цикл foreach. Уберите foreach полностью, если ещё не сделали этого.
    14 января 2015 г. 11:19
  • На скриншоте у вас цикл for вложен в цикл foreach. Уберите foreach полностью, если ещё не сделали этого.
    кок раз это и сделал... Но ничего...
    14 января 2015 г. 11:26
  • Вот полный код ,...

     private void button2_Click(object sender, EventArgs e)
            {
                if (backgroundWorker1.IsBusy != true)
                {
                    // Start the asynchronous operation.
                    backgroundWorker1.RunWorkerAsync();
                }
            }
    
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
    
                FtpClient client = new FtpClient();
    
                //Задаём параметры клиента.
                client.PassiveMode = true; //Включаем пассивный режим.
                string FTP_SERVER = ftp_host.Text;// адерс фтп сервера
                int FTP_PORT = 21;//порт сервера
                string FTP_USER = ftp_user.Text;// Имя пользователя
                string FTP_PASSWORD = ftp_password.Text;// Пароль пользователя
    
                //Подключаемся к FTP серверу.
                client.Connect(30000, FTP_SERVER, FTP_PORT);
                client.Login(30000, FTP_USER, FTP_PASSWORD);
    
                StreamReader lintfilesSErver = new StreamReader(@"D:\import.txt");
                string sLine = "";
    
                ArrayList lintfile = new ArrayList();
    
                while (sLine != null)
                {
                    sLine = lintfilesSErver.ReadLine();
                    if (sLine != null)
                        lintfile.Add(sLine);
                }
                lintfilesSErver.Close();
                Invoke((Action)delegate
                {
                    progressBar1.Value = 0;
                });
    
                    for (int i = 0; i < lintfile.Count; i++)
                    {
                        string correctString = lintfile[i].ToString().Replace("/public_html/", @"D:\OpenServer\domains\qwerty.by/"); // LICENSE.txt
                        string fileName = @"D:\OpenServer\domains\qwerty.by/" + correctString;
    
                        // Создание списка папок
                        string CreateDirectory = Path.GetDirectoryName(correctString);
    
                        // Формированным списком папок...
                        Directory.CreateDirectory(CreateDirectory);
                        // Принимает указанный файл с сервера.
                        client.GetFile(30000, correctString, lintfile[i].ToString());
    
                        backgroundWorker1.ReportProgress(i);
                    }
            }
    
    
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
                this.progressBar1.Value = e.ProgressPercentage;
            }
    
            private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (e.Cancelled == true)
                {
                    resultLabel.Text = "Canceled!";
                }
                else if (e.Error != null)
                {
                    resultLabel.Text = "Error: " + e.Error.Message;
                }
                else
                {
                    resultLabel.Text = "Done!";
                }
            }
    Но ничего не получается... Такие же ошибки...

    14 января 2015 г. 11:26