在什么情况下,后台工作人员不会运行DoWork方法来完成?

时间:2009-11-25 19:52:15

标签: c# .net backgroundworker

我在表单上有一个后台工作程序,我在其中编写了一些长时间运行的数据库交互。

单击表单上的按钮时,会运行以下命令:

if (!bwFind.IsBusy)
    bwFind.RunWorkerAsync(param);

其中bwFind是BackgroundWorker,param是DevExpress CriteriaOperator。

我在Progress_Changed事件处理程序中更新了一个进度条。

我在RunWorkerCompleted事件处理程序中执行以下操作:

dataGrid.DataSource = this.dataObject;
dataGrid.Refresh();
label1.Text = this.dataObject.Count.ToString(); // problem appears here

问题是,我在所注明的行上得到了Null Ref Exception,但是我在DoWork方法结束时实例化了该对象。

我知道DoWork没有运行,因为如果我在使用之前进行空检查,请再次按下表单上的按钮......它会运行,并且所有工作都按预期工作。

也许我没有正确使用BackgroundWorker,但每次使用该组件时都会经常发生这种情况。

2 个答案:

答案 0 :(得分:2)

implementing RunWorkerCompleted有一个特定的模式。

  • 首先,检查e .Error(例外)
  • 其次,检查取消,如果支持
  • 最后,接受结果

您通常将结果分配给DoWork中的e.Result以将其传输到RunWorkerCompleted,但您使用类成员。确保this.dataObject的使用是线程安全的。

   void backgroundWorker1_RunWorkerCompleted(object sender, 
        RunWorkerCompletedEventArgs e)
    {
        // First, handle the case where an exception was thrown.
        if (e.Error != null)
        {
            label1.Text = e.Error.Message;
        }
        else if (e.Cancelled)
        {
            label1.Text = "Canceled";
        }
        else
        {
            // Finally, handle the case where the operation 
            // succeeded.
            label1.Text = this.dataObject.Count.ToString();
        }

        // update UI for Thread completed
    }

答案 1 :(得分:0)

还有一个问题。如果父线程被杀死/中止,你就不会得到Complete