BackgroundWorker在Listbox中添加项目时在C#中给出问题?

时间:2009-06-23 11:35:53

标签: c# backgroundworker listboxitems

我有一个列表框,我必须至少提供2个文件才能合并。 当我单击Merge按钮时,合并完成。进度条启动,出现消息框已经合并了文件。我正在使用后台工作程序来运行进度条。

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

例如,对于2个文件消息显示1ce den添加1个更多文件消息出现2ice,列表框消息中的1个文件出现3ic.Like dis it it continue ....

当我使用调试器来跟踪它时,我注意到每当我在listbox中添加文件时,我的后台工作器Runcompleted事件被调用了很多次。这是Merge按钮Click代码事件的代码...

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

我不知道我哪里出错了。 请帮忙......谢谢...

2 个答案:

答案 0 :(得分:3)

我猜测在每个合并按钮上单击您正在注册一个新的代理。如果以下代码:

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

在Merge按钮的click事件处理程序中,考虑将其移动到表单初始化方法。您只需要注册一次委托。下次你添加一个新的,所以在第二次合并时点击它将运行两次,第三次点击三次,依此类推。

答案 1 :(得分:2)

如果你的worker是一个模块级变量,并且每次按下按钮时你都会附加到它的invokation列表,那么每次都会调用该方法。 假设您单击3次,则此代码Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);将执行3次,并将被调用3次。 在实例化工作对象时设置一次Completed处理程序。

呸!打败它!