C#Backgroundworker继续运行DoWork

Coo*_*guy 0 c#

以下是我的编码:

    Form2 msgForm;
    private void button3_Click_1(object sender, EventArgs e)
    {

        bw.WorkerReportsProgress = true;
        bw.WorkerSupportsCancellation = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

        msgForm = new Form2();

        try
        {
            bw.RunWorkerAsync();

            msgForm.ShowDialog();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        // Coding that transmit protocol and will last around 2 minutes.
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        msgForm.Close();
    }
Run Code Online (Sandbox Code Playgroud)

每次单击按钮发送持续约2分钟的协议时,我都会使用后台工作方法.在传输过程中,From2将显示"请稍候".

但是我使用这种编码有一些问题.问题是,当我第一次点击按钮时,它会发送一次协议.之后我再次点击这是第二次,它传输协议两次.之后我再次点击这是第三次,它将协议传输3次......依此类推.每次单击按钮时,传输协议的次数都会增加.

不是每次我点击按钮时它只会在void bw_DoWork中编码运行吗?

我的编码有问题吗?

Ale*_*lex 6

每次单击时,您都会附加一个额外的处理程序,然后它会与之前添加的所有内容一起运行,并保持原样(因为对象仍在那里,您正在重新使用它).

要解决此问题,您需要:

  • 在方法中移动后台worker的声明(所以每次都是新的,只有一个DoWork处理程序

像这样:

private void button3_Click_1(object sender, EventArgs e)
{
    BackgroundWorker bw = new BackgroundWorker();
    // rest of your code
}
Run Code Online (Sandbox Code Playgroud)
  • 移动.DoWork += ...将处理程序附加到类的构造函数中

这主要取决于你是否在其他地方使用该工作人员.