我正在尝试使用后台工作者,但它不起作用 - 为什么

本文关键字:不起作用 为什么 工作者 后台 | 更新日期: 2023-09-27 18:32:43

这是DoWork事件、ProgressChanged事件和RunWorkerCompleted事件的代码。问题是进度条在函数进程操作结束之前达到 100% 的速度要快得多。因此,当进度条达到 100% 时,我收到错误异常,因为进度条不能为 101%

我需要以某种方式使进度条将根据功能过程/进度获得进度。我想我在DoWork事件中的计算有问题。

Form1顶部,我添加了:

Int i;

在构造函数中,我做到了:

i = 0;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();

这是Backgroundworker的事件:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   BackgroundWorker worker = sender as BackgroundWorker;
   //int currentLength;
   //int currentIndex;
   //int lastIndex = 0;
   string startTag = "T256='"";
   string endTag = "'"";
   int startTagWidth = startTag.Length;
   //int endTagWidth = endTag.Length;
   int index = 0;
   h = new StreamReader(@"d:'DeponiaSplit'testingdeponias_Translated.txt");
   while ((line = h.ReadLine()) != null)
   {
      if (index > f.LastIndexOf(startTag))
      {
         break;
      }
      int startTagIndex = f.IndexOf(startTag, index);
      int stringIndex = startTagIndex + startTagWidth;
      index = stringIndex;
      int endTagIndex = f.IndexOf(endTag, index);
      int stringLength = endTagIndex - stringIndex;
      if (stringLength != 0)
      {
         string test = f.Substring(stringIndex, stringLength);
         f = f.Substring(0, stringIndex) + line + f.Substring(stringIndex + stringLength);
         if (listBox1.InvokeRequired)
         {
            textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = line; }));
         }
         i = i + 1;
         System.Threading.Thread.Sleep(500);
         worker.ReportProgress((i * 1));
      }
   }
   h.Close();
   StreamWriter w = new StreamWriter(@"D:'New folder (24)'000004aa.xml");
   w.AutoFlush = true;
   w.Write(f);
   w.Close();
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //this.progressBar1.Text = (e.ProgressPercentage.ToString() + "%");
    progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   if ((e.Cancelled == true))
   {
      this.progressBar1.Text = "Canceled!";
   }
   else if (!(e.Error == null))
   {
      this.progressBar1.Text = ("Error: " + e.Error.Message);
   } 
   else
   {
       this.progressBar1.Text = "Done!";
   }
}

为什么它不能正常工作?

使用文件流工作

现在我想向进度条添加一个标签,该标签将显示%并且标签将根据进度条移动,我不想禁用进度条绿色进度只是为了添加%并以百分比显示数字。

所以在ProgressChanged事件中,我做到了:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    label3.Text = (e.ProgressPercentage.ToString() + "%");
} 

但它不起作用 - label13不会仅将百分比更改为 1。我想看到类似 1%...2%...3%...等等。我该怎么做?

我正在尝试使用后台工作者,但它不起作用 - 为什么

为什么不使用File.ReadAllLines,它返回一个字符串数组。您可以将进度报告为正在处理的行占行总数的百分比:

string[] lines = File.ReadAllLines(@"d:'DeponiaSplit'testingdeponias_Translated.txt"); 
// ...
worker.ReportProgress(i * 100 / lines.Length);

"ReportProgress((" 方法在 "i" 用 "i+1" 语句递增之后立即报告 "i"。 i 是一个变量,每次找到与提供的参数匹配的字符串时,它都会递增。 我认为这里的问题是您在没有上下文的情况下报告一个整数。 您是否知道文件中总共有多少行包含与您的参数匹配的字符串。 我建议报告 (i/totalNumLinesMatchingParameters( * 100。 这将报告一个百分比数字。 但是,这不包括写入文件的操作。 因此,如果您打算在进度条/进度条标签中包含写入文件的操作,则可能需要以不同的方式缩放上述内容......