C# 使用textBox1.AppendText()时,在bw_DoWork()和bw_ProgressChanged()上运行两次后台工作程序
我正在使用Visual Studio 2013,我不明白为什么在使用C# 使用textBox1.AppendText()时,在bw_DoWork()和bw_ProgressChanged()上运行两次后台工作程序,c#,backgroundworker,C#,Backgroundworker,我正在使用Visual Studio 2013,我不明白为什么在使用textBox1.AppendText()时,bw\u ProgressChanged()会运行两次。另外,bw\u DoWork()运行两次 代码只是来自的复制粘贴,不同之处在于我使用的是textBox1.AppendText()而不是textBox1.Text=”“ 代码如下所示: public partial class Form1 : Form { public Form1() { Ini
textBox1.AppendText()时,bw\u ProgressChanged()
会运行两次。另外,bw\u DoWork()
运行两次
代码只是来自的复制粘贴,不同之处在于我使用的是textBox1.AppendText()
而不是textBox1.Text=”“
代码如下所示:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
private void button1_Click(object sender, EventArgs e)
{
if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; (i <= 10); i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress((i * 10));
}
}
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.textBox1.AppendText(e.ProgressPercentage.ToString() + "%\n");
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
this.textBox1.AppendText("Canceled!");
}
else if (!(e.Error == null))
{
this.textBox1.AppendText("Error: " + e.Error.Message);
}
else
{
this.textBox1.AppendText("Done!");
}
}
}
而不是:
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
完成!
我曾尝试将进度直接传递给局部变量,然后将其传递给textbox1
,但没有任何区别。知道为什么会发生这种情况吗?事件方法中的代码会运行两次,因为您以某种方式订阅了两次ProgressChanged
事件
由于我在您的代码中没有看到两个订阅,您可能已经通过设计器订阅了它(请检查designer.cs
文件以确认),因此从构造函数中删除这一行:
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
在进行此操作时,请再次检查DoWork
和RunWorkerCompleted
。您很可能也订阅了两次,这就解释了为什么您的输出打印10到100,然后再次打印相同的加倍值。事件方法中的代码运行了两次,因为您以某种方式订阅了两次ProgressChanged
事件
由于我在您的代码中没有看到两个订阅,您可能已经通过设计器订阅了它(请检查designer.cs
文件以确认),因此从构造函数中删除这一行:
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
在进行此操作时,请再次检查DoWork
和RunWorkerCompleted
。您很可能也订阅了两次,这就解释了为什么您的输出打印10到100,然后再次打印相同的加倍值。事件方法中的代码运行了两次,因为您以某种方式订阅了两次ProgressChanged
事件
由于我在您的代码中没有看到两个订阅,您可能已经通过设计器订阅了它(请检查designer.cs
文件以确认),因此从构造函数中删除这一行:
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
在进行此操作时,请再次检查DoWork
和RunWorkerCompleted
。您很可能也订阅了两次,这就解释了为什么您的输出打印10到100,然后再次打印相同的加倍值。事件方法中的代码运行了两次,因为您以某种方式订阅了两次ProgressChanged
事件
由于我在您的代码中没有看到两个订阅,您可能已经通过设计器订阅了它(请检查designer.cs
文件以确认),因此从构造函数中删除这一行:
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
在进行此操作时,请再次检查DoWork
和RunWorkerCompleted
。您很可能也订阅了两次,这就解释了为什么您的输出打印10到100,然后再次打印相同的加倍值