C# 使用textBox1.AppendText()时,在bw_DoWork()和bw_ProgressChanged()上运行两次后台工作程序

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

我正在使用Visual Studio 2013,我不明白为什么在使用
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,然后再次打印相同的加倍值