我有一个通过以下代码触发事件的库:
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,但我认为这没有任何区别......
感谢您的帮助 帕特里克
答案 0 :(得分:0)
我找到了解决方案,这是显而易见的。现在很明显了。 在主窗口中,我调用了库函数,只有在我从类的实例中分离事件之后。 因此,如果在没有后台工作的情况下启动,则执行是串行的,因此首先执行代码,然后分离事件。 但是当启动backgroundWorker时,执行是并行的,因此在执行代码时,它会在上述代码终止之前分离。从这个错误。感谢大家的帮助。