BackgroundWorker在列表框中添加项目时在C#中给出问题?
我有一个列表框,其中我必须提供至少2个文件进行合并。 当我单击“合并”按钮时,合并完成。进度条将启动,消息框显示文件已合并。我正在使用后台工作程序运行进度条 现在的问题是,当对2个文件进行合并时,我再添加一个文件,单击“合并”按钮“合并完成”消息出现,我单击消息框上的“确定”,消息框再次显示与合并已完成的消息相同的消息。此消息框继续显示我在列表框中添加文件的次数 例如,对于2个文件,消息显示1添加1个文件时显示1个den消息显示2 CE,列表框中显示1个文件消息显示3 IC。与dis一样,它继续 当我使用调试器跟踪它时,我注意到每当我在列表框中添加文件时,我的后台工作程序Runcompleted事件就会被调用那么多次BackgroundWorker在列表框中添加项目时在C#中给出问题?,c#,backgroundworker,listboxitems,C#,Backgroundworker,Listboxitems,我有一个列表框,其中我必须提供至少2个文件进行合并。 当我单击“合并”按钮时,合并完成。进度条将启动,消息框显示文件已合并。我正在使用后台工作程序运行进度条 现在的问题是,当对2个文件进行合并时,我再添加一个文件,单击“合并”按钮“合并完成”消息出现,我单击消息框上的“确定”,消息框再次显示与合并已完成的消息相同的消息。此消息框继续显示我在列表框中添加文件的次数 例如,对于2个文件,消息显示1添加1个文件时显示1个den消息显示2 CE,列表框中显示1个文件消息显示3 IC。与dis一样,它继续
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)?