BackgroundWorker крутится больше раз чем нужно - C#
Формулировка задачи:
Добрый вечер.
Есть такой код:
В итоге проблема с прогрессбаром, он должен идти по таком сценарию 0 - 1 -2 -3 а он почемуто идет вот по такому: 0 -1 -2 -0 -1 -2 -3
В чем я ошибся?
Спасибо.
////////////// 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; }
Решение задачи: «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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д