C# 事件从 backgroundWorker 触发 null
C# event firing null from 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 内部调用时,在 RaiseEvent 内部调用时 OnStatusChange 始终为 NULL,因此不会触发该事件。我总是在后台工作人员的外部和内部以相同的方式调用 RaiseEvent(...)。
现在明白问题了,解决办法是什么?
** 编辑 ** 我正在使用 C# WPF,但我认为这没有任何区别...
感谢您的帮助
帕特里克
我找到了解决方案,而且很明显。现在很明显了。
从主要 window 我调用了库函数,只有在这些函数之后我才将事件与 class 的实例分离。
因此,如果在没有 backgroundWorked 的情况下启动,则执行是串行的,因此它首先执行代码,然后分离事件。
但是当启动 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 内部调用时,在 RaiseEvent 内部调用时 OnStatusChange 始终为 NULL,因此不会触发该事件。我总是在后台工作人员的外部和内部以相同的方式调用 RaiseEvent(...)。 现在明白问题了,解决办法是什么?
** 编辑 ** 我正在使用 C# WPF,但我认为这没有任何区别...
感谢您的帮助 帕特里克
我找到了解决方案,而且很明显。现在很明显了。 从主要 window 我调用了库函数,只有在这些函数之后我才将事件与 class 的实例分离。 因此,如果在没有 backgroundWorked 的情况下启动,则执行是串行的,因此它首先执行代码,然后分离事件。 但是当启动 backgroundWorker 时,执行是并行的,因此在执行代码时,它甚至在上述代码终止之前就分离了。从这个错误。感谢大家的帮助。