我正在尝试使用backgroundworker但它不起作用 - 为什么?

时间:2012-04-29 17:52:28

标签: c#

这是DoWork事件ProgressChanged事件和RunWorkerCompleted事件的代码。问题是在功能处理操作结束之前,progressBar的速度提高了100%。所以当progressBar达到100%时,由于progressBar不能达到101%,我会收到错误异常

我需要以某种方式使progressBar根据功能进程/进度获得进展。我想我在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!";
   }
}

为什么它不能正常工作?

使用FileStream

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

所以在ProgressChanged事件中我做了:

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

但它不起作用 - label13不会仅将%更改为1.我希望看到类似1%... 2%... 3%......等等上。我该怎么办?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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