我正在尝试使用后台工作者,但它不起作用 - 为什么
本文关键字:不起作用 为什么 工作者 后台 | 更新日期: 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。 这将报告一个百分比数字。 但是,这不包括写入文件的操作。 因此,如果您打算在进度条/进度条标签中包含写入文件的操作,则可能需要以不同的方式缩放上述内容......