BackgroundWorker крутится больше раз чем нужно - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер. Есть такой код:
                    //////////////
 
                    progressBar1.Minimum = 0;
                    progressBar1.Maximum = arrStrLink.Count;
 
                    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
 
                    backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
 
                    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
 
                    backgroundWorker1.WorkerReportsProgress = true;
 
                    backgroundWorker1.RunWorkerAsync();
 
                    //////////////
 
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            func();
        }
 
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (e.UserState.ToString() == "Start")
            {
                button1.Enabled = false;
            }
 
            progressBar1.Value = e.ProgressPercentage;
 
            richTextBox1.Text = e.ProgressPercentage.ToString();
 
        }
 
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            string folder = System.Windows.Forms.Application.StartupPath + @"\links\";
 
            if (System.IO.Directory.Exists(folder))
            {
                string[] files = System.IO.Directory.GetFiles(folder);
 
                string[] lines;
 
                int count_lines = 0;
 
                foreach (string val in files)
                {
                    lines = System.IO.File.ReadAllLines(val, Encoding.UTF8);
                    count_lines = count_lines + lines.Length - 1;
                }
 
                label4.Text = files.Length.ToString();
                label2.Text = count_lines.ToString();
            }
 
            button1.Enabled = true;
 
            arrStrLink.Clear();
 
            arrName.Clear();
        }
 
private void func()
        {
 
            //Счетчик проходов цикла
            int for_count = 0;
 
            string sep = "Start";
 
            backgroundWorker1.ReportProgress(for_count, sep);
 
            string folder = System.Windows.Forms.Application.StartupPath + @"\links\";
 
            foreach (string value in arrStrLink)
            {
 
                //Получаем html код страницы
                var http = new System.Net.WebClient();
 
                http.Encoding = System.Text.Encoding.UTF8;
 
                string html = http.DownloadString(value);

                //Составляем регулярку для html кода
                string pattern = @"<div class=""model""><a href=""(.*)""";
 
                Regex reg = new Regex(pattern);
 
                Match match = reg.Match(html);

                //Обрабатываем полученный html код регуляркой
                var sb = new StringBuilder();
 
                while (match.Success)
                {
                    sb.AppendLine("http://sempermoto.ru/bds/statistic/" + match.Groups[1].Value);
                    match = match.NextMatch();
                }
 
                string[] arrLink = sb.ToString().Split(new char[] { '\n' });
 
                //Создаем переменнуя для хранения ссылок
                string link = "";
 
                foreach (string val in arrLink)
                {
                    link += val + "\n";
                }
 
                string full_path = folder + arrName[for_count] + ".txt";
 
                if (System.IO.Directory.Exists(folder))
                {
                    System.IO.File.WriteAllText(full_path, link, Encoding.UTF8);
                }
                else
                {
                    System.IO.Directory.CreateDirectory(folder);
                    System.IO.File.WriteAllText(full_path, link, Encoding.UTF8);
                }
 
                for_count++;
 
                backgroundWorker1.ReportProgress(for_count, sep);
 
            }
 
            for_count = 0;
 
        }
В итоге проблема с прогрессбаром, он должен идти по таком сценарию 0 - 1 -2 -3 а он почемуто идет вот по такому: 0 -1 -2 -0 -1 -2 -3 В чем я ошибся? Спасибо.

Решение задачи: «BackgroundWorker крутится больше раз чем нужно»

textual
Листинг программы
        public Form1()
        {
            InitializeComponent();
 
            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
 
            backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
 
            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
 
            backgroundWorker1.WorkerReportsProgress = true;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы