C#事件从backgroundWorker

时间:2015-11-10 06:53:46

标签: c# events null backgroundworker

我有一个通过以下代码触发事件的库:

  public delegate void ChangedEventHandler(String currentFunction, String PCDMessage, ePcdEventType pcdEventType, ePcdEvent pcdEvent);
  public event ChangedEventHandler OnStatusChange;

protected virtual void RaiseEvent(String strCurrentFunction, String strMessage, ePcdEventType pcdEventType, ePcdEvent pcdEvent)
    {
        if (OnStatusChange != null)
            OnStatusChange(strCurrentFunction, strMessage, pcdEventType, pcdEvent);
    }

当我从以下backgroundWorker

中触发事件时,一切正常
 bwExecute = new BackgroundWorker();
 bwExecute.DoWork += BwExecute_DoWork;
 bwExecute.RunWorkerCompleted += Bg_RunWorkerCompleted;
 object[] parameters = new object[] { currentFunc, partProgramFilename, varsValuesList};
 bwExecute.RunWorkerAsync(parameters);

RaiseEvent中的OnStatusChange始终为null,因此永远不会被触发。 BwExecute_DoWork是:

 private void BwExecute_DoWork(object sender, DoWorkEventArgs e)
    {
        object[] parameters = e.Argument as object[];
        String currentFunc = parameters[0].ToString();
        String partProgramFilename = parameters[1].ToString();
        List<String> varsValueList = (List<String>)parameters[2];

        ExecuteJob(currentFunc,partProgramFilename, varsValueList);
    }

和RaiseEvent在ExecuteJob例程中触发,就像它们在代码的其他部分被触发一样。

** ADD **我注意到只有在backgroundWorker内部调用OnStatusChange时,在RaiseEvent内部调用时总是为空,因此不会触发事件。我总是以同样的方式在后台工作者的外部和内部调用RaiseEvent(...)。 现在明白了问题,解决方案是什么?

**编辑**我使用的是C#WPF,但我认为这没有任何区别......

感谢您的帮助 帕特里克

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,这是显而易见的。现在很明显了。 在主窗口中,我调用了库函数,只有在我从类的实例中分离事件之后。 因此,如果在没有后台工作的情况下启动,则执行是串行的,因此首先执行代码,然后分离事件。 但是当启动backgroundWorker时,执行是并行的,因此在执行代码时,它会在上述代码终止之前分离。从这个错误。感谢大家的帮助。