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

C# 在什么情况下,后台工作人员不会运行Dowwork方法来完成工作?,c#,.net,backgroundworker,C#,.net,Backgroundworker,我在表单上有一个后台工作人员,我在其中编写了一些长时间运行的DB交互 单击表单上的按钮时,将运行以下命令: if (!bwFind.IsBusy) bwFind.RunWorkerAsync(param); 其中bwFind是BackgroundWorker,param是DevExpress标准操作符 我在Progress\u Changed事件处理程序中更新progressbar 我在RunWorkerCompleted事件处理程序中执行以下操作: dataGrid.DataSour

我在表单上有一个后台工作人员,我在其中编写了一些长时间运行的DB交互

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

if (!bwFind.IsBusy)
    bwFind.RunWorkerAsync(param);
其中bwFind是BackgroundWorker,param是DevExpress标准操作符

我在Progress\u Changed事件处理程序中更新progressbar

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

dataGrid.DataSource = this.dataObject;
dataGrid.Refresh();
label1.Text = this.dataObject.Count.ToString(); // problem appears here
问题是,我在注释的行中得到了一个Null Ref异常,但我在DoWork方法的末尾实例化了该对象

我知道DoWork没有运行,因为如果我在使用它之前进行空检查,请再次按下窗体上的按钮。。。它运行起来,一切都正常


也许我没有正确地使用BackgroundWorker,但是每当我使用组件时,这种情况经常发生。

有一种特定的模式

  • 首先,检查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
    }

还有一个问题。如果父线程被终止/中止,您将无法完成

这是显而易见的,我敢肯定,但是当抛出异常时,您已经检查了This.dataObject的值,对吗?它肯定是空的,但关键是它永远不应该是空的。它是在DoWork中设置的(由于跨线程操作而退出),结果我在DoWork中修改了一个UI项。检查e.Error.Message表明了这一点。非常感谢。我认为使用BackgroundWorker的全部意义在于,我不必(开始)调用?您仍然必须从DoWork调用。(仅)已完成事件和进度事件被调用到主线程。他在父线程(=主线程)中遇到null ref异常。