BackgroundWorker在列表框中添加项目时在C#中给出问题?

BackgroundWorker在列表框中添加项目时在C#中给出问题?,c#,backgroundworker,listboxitems,C#,Backgroundworker,Listboxitems,我有一个列表框,其中我必须提供至少2个文件进行合并。 当我单击“合并”按钮时,合并完成。进度条将启动,消息框显示文件已合并。我正在使用后台工作程序运行进度条 现在的问题是,当对2个文件进行合并时,我再添加一个文件,单击“合并”按钮“合并完成”消息出现,我单击消息框上的“确定”,消息框再次显示与合并已完成的消息相同的消息。此消息框继续显示我在列表框中添加文件的次数 例如,对于2个文件,消息显示1添加1个文件时显示1个den消息显示2 CE,列表框中显示1个文件消息显示3 IC。与dis一样,它继续

我有一个列表框,其中我必须提供至少2个文件进行合并。 当我单击“合并”按钮时,合并完成。进度条将启动,消息框显示文件已合并。我正在使用后台工作程序运行进度条

现在的问题是,当对2个文件进行合并时,我再添加一个文件,单击“合并”按钮“合并完成”消息出现,我单击消息框上的“确定”,消息框再次显示与合并已完成的消息相同的消息。此消息框继续显示我在列表框中添加文件的次数

例如,对于2个文件,消息显示1添加1个文件时显示1个den消息显示2 CE,列表框中显示1个文件消息显示3 IC。与dis一样,它继续

当我使用调试器跟踪它时,我注意到每当我在列表框中添加文件时,我的后台工作程序Runcompleted事件就会被调用那么多次

Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted +=
    new  RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
Worker.WorkerSupportsCancellation = true;

if (!Worker.IsBusy)
    Worker.RunWorkerAsync();
else
    MessageBox.Show("Cannot run background worker twice ");

if (Worker.IsBusy)
{
    progress = new ProgressDialogDTB();
    progress.FormClosing += 
        new FormClosingEventHandler(ProgressDialog_FormClosing);
    progress.ShowDialog(this);
}
while (Worker.IsBusy)
{
    Application.DoEvents();
}

//For Background Worker completed Event...
private void Worker_RunWorkerCompleted(object sender, 
    AsyncCompletedEventArgs e)
{            
    if (progress != null)
    {
        progress.Close();
        progress = null;
    }
    if ( e.Cancelled )
        MessageBox.Show(" Progress was cancelled ");                               

    if (e.Error == null)
        if (!e.Cancelled)
            MessageBox.Show("Files has been merged ");

    if (e.Error != null)
        MessageBox.Show(e.Error.Message);     
}//Worker_RunWorkerCompleted
我不知道我错在哪里。
请帮助…谢谢…

我猜在每次单击合并按钮时,您都在注册一名新代表。如果输入以下代码:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new  System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

在合并按钮的单击事件处理程序中,考虑将其移动到表单IntILITION方法中。您只需要注册一次代理。下次执行此操作时,会添加一个新的代理,因此在第二次合并单击时,它将运行两次,在第三次单击时,它将运行三次,依此类推。

我猜在每次合并按钮单击时,您都会注册一个新的代理。如果输入以下代码:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new  System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

在合并按钮的单击事件处理程序中,考虑将其移动到表单IntILITION方法中。您只需要注册一次代理。下次执行此操作时,它会添加一个新的,因此在第二次合并单击时,它将运行两次,第三次单击时,它将运行三次,依此类推。

如果您的辅助对象是一个模块级变量,并且您每次单击按钮时都会将其追加到其调用列表中,则每次都会调用该方法。 假设单击3次,则此代码
Worker.runworker已完成+=
新的RunWorkerCompletedEventHandler(Worker\u RunWorkerCompleted)将执行3次,并将被调用3次。
在实例化worker对象时设置一次已完成的处理程序


呸!被打败了

如果您的worker是一个模块级变量,并且每次单击按钮时都要将其追加到其调用列表中,那么每次都会调用该方法。 假设单击3次,则此代码
Worker.runworker已完成+=
新的RunWorkerCompletedEventHandler(Worker\u RunWorkerCompleted)将执行3次,并将被调用3次。
在实例化worker对象时设置一次已完成的处理程序


呸!被打败了

你能分享工作代码吗?什么是完成?如果它被调用了x次,那么你的工作人员会指出它是完整的x次,或者是因为它是这样工作的,或者是被实例化了x次。有很多代码,但都与问题无关。你不知道你的问题。但我会重新考虑:while(Worker.IsBusy){Application.DoEvents();}。它正在消耗cpu时间!(或者只是为了测试?)你能分享工作代码吗?什么是完成?如果它被调用了x次,那么你的工作人员会指出它是完整的x次,或者是因为它是这样工作的,或者是被实例化了x次。有很多代码,但都与问题无关。你不知道你的问题。但我会重新考虑:while(Worker.IsBusy){Application.DoEvents();}。它正在消耗cpu时间!(或者只是为了测试?)谢谢..它工作了..还有一件事我的进度条还在运行,当消息框显示“文件已合并”时。如何在消息框出现之前使进度条消失?你使它工作了吗?我假设问题是,在worker completed事件处理程序中,负责关闭对话框的条件if(progress!=null)下的代码没有执行(条件的计算结果为false)?谢谢..它工作了..当消息框显示“文件已合并”时,我的进度条仍在运行。如何在消息框出现之前使进度条消失?你使它工作了吗?我假设问题是,在worker completed事件处理程序中,负责关闭对话框的条件if(progress!=null)下的代码没有执行(条件的计算结果为false)?