Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自backgroundWorker的C#事件触发空值_C#_Events_Null_Backgroundworker - Fatal编程技术网

来自backgroundWorker的C#事件触发空值

来自backgroundWorker的C#事件触发空值,c#,events,null,backgroundworker,C#,Events,Null,Backgroundworker,我有一个通过以下代码触发事件的库: public delegate void ChangedEventHandler(String currentFunction, String PCDMessage, ePcdEventType pcdEventType, ePcdEvent pcdEvent); public event ChangedEventHandler OnStatusChange; 及 一切正常,但当我从以下后台人员触发事件时 bwExecute = new Backg

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

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

一切正常,但当我从以下后台人员触发事件时

 bwExecute = new BackgroundWorker();
 bwExecute.DoWork += BwExecute_DoWork;
 bwExecute.RunWorkerCompleted += Bg_RunWorkerCompleted;
 object[] parameters = new object[] { currentFunc, partProgramFilename, varsValuesList};
 bwExecute.RunWorkerAsync(parameters);
RaiseEvent中的OnStatusChange始终为null,因此永远不会被激发。 BWU工作是:

 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);
    }
private void BwExecute\u DoWork(对象发送方,DoWorkEventArgs e)
{
对象[]参数=e.参数作为对象[];
字符串currentFunc=参数[0]。ToString();
String partProgramFilename=参数[1]。ToString();
List varsValueList=(List)参数[2];
ExecuteJob(currentFunc、partProgramFilename、varsValueList);
}
RaiseEvent在ExecuteJob例程中被激发,就像它们在代码的另一部分中被激发一样

**添加**我注意到,只有在backgroundWorker内部调用时,RaiseEvent内部调用的OnStatusChange始终为NULL,因此不会触发事件。我总是以同样的方式调用RaiseEvent(…),无论是在后台工作程序的外部还是内部。 现在明白了问题所在,解决办法是什么

**编辑**我正在使用C#WPF,但我不认为这有什么区别

谢谢你的帮助
帕特里克

我找到了解决办法,这是显而易见的。现在很明显。 在主窗口中,我调用了库函数,只有在这些函数之后,我才将事件从类的实例中分离出来。 因此,如果在没有后台工作的情况下启动,则执行是串行的,因此它首先执行代码,然后分离事件。
但是当启动backgroundWorker时,执行是并行的,因此在执行代码时,它甚至在前面提到的代码终止之前就分离了。从这一点可以看出错误。谢谢大家的帮助。

这些都是会员功能。您确定使用了正确的对象吗?您可以跟踪它们的创建,并确保在稍后使用的同一类对象中注册事件处理程序。顺便说一句,您从未给出调用RaiseEvent的代码。很可能这是一个实例化问题。我认为这是一个线程问题,有一个主线程和一个后台工作线程…还有一个数据传递问题…为什么不使用dispatcher呢?尝试使用这个control.dispatcher.Invoke(()=>{//call your function});然而,一个问题是何时实例化OnStatusChange。当您这样定义变量,但不将其设置为您显示的代码中的任何内容时,它将为null。所以知道它在何时何地被实例化是很重要的。@SaadAbdullah你是对的!正如我在**添加**中所说的,这是一个线程问题,因为我在backgroundWorker内外以相同的方式调用RaiseEvent(…)。在外面它工作在里面它不工作。因此,您建议使用调度程序,但您指的是控件。这里没有控件,只有在backgroundWorker中为null的事件。那么我该如何纠正它呢?Thanx@patrick如何访问OnStatusChange?我的意思是,您确定要在前台和后台工作程序中使用正确的类实例吗?(根据您显示的代码,无法100%确定情况是否如此)
 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);
    }