【问题标题】:BackgroundWorker giving problem in C# while adding item in Listbox?在列表框中添加项目时,BackgroundWorker 在 C# 中出现问题?
【发布时间】:2009-06-23 19:53:13
【问题描述】:

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

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

例如,对于 2 个文件,消息出现 1ce den 在添加 1 个文件时出现消息 2ice,列表框中出现 1 个文件消息 3ic.Like dis 它继续......

当我使用调试器跟踪它时,我注意到每当我在列表框中添加文件时,我的 Background Worker 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代码吗?什么构成完成?如果它被调用 x 次,那么你的工作人员表示它已完成 x 次是有道理的,要么是因为它是这样工作的,要么它被实例化了 x 次。
  • 很多代码,但与问题无关。
  • 不知道你的问题。但我会重新考虑:while (Worker.IsBusy){ Application.DoEvents();} 也是。是吃cpu的时间! (或者只是为了测试?)

标签: c# backgroundworker listboxitems


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢..它起作用了....当出现“文件已合并”的消息框时,我的进度条仍在运行。如何在消息框出现之前让进度条消失?
  • 你成功了吗?我认为问题是在工作人员完成的事件处理程序中,如果(进度!= null)负责关闭对话框的条件下方的代码没有执行(条件评估为假)?
【解决方案2】:

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

呸!被它打败了!

【讨论】:

    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2020-05-29
    相关资源
    最近更新 更多