在处理ManualResetEvent.WaitOne()时,我有一个奇怪的随机NPE错误。这是我的代码。
我有一个方法创建ManualResetEvent对象,然后将其作为依赖参数(manualResetEvent)之一传递给Windows Workflow Foundation(WWF)工作流实例,然后我进入manualResetEvent.WaitOne()API。
ManualResetEvent manResetEvt = new ManualResetEvent(false);
Dictionary<String, Object> wfArgs = new Dictionary<string, object>();
wfArgs["manualResetEvent"] = manResetEvt;
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(MyWWFProcess), wfArgs);
instance.Start();
manResetEvt.WaitOne();
当作业在WWF内完成时,我只需调用manualResetEvent.set()。
if (this.manualResetEvent != null)
{
this.manualResetEvent.Set();
}
所有这些编译好并且在运行时,我看到流程按预期进入WWF并且调用者也等待WaitOne()调用。
WWF调用manualResetEvent.Set()通知调用者的那一刻,我看到调用者不是WWF的NPE异常。
System.NullReferenceException:未将对象引用设置为对象的实例。
我真的不知道这个例外的起源。当我在VS IDE中调试此代码时,一切正常,但只有当应用程序处于发布模式时,才会看到此异常。
我在这里做错了什么?
答案 0 :(得分:0)
我找到了问题的答案。基于James Thorpe的建议,我从异常中打印了堆栈跟踪,结果发现应用程序在调用此方法时发送了一个NULL数据点,并且WaitOne()没有导致NPE。当我从VS IDE调试器运行单元测试时,我传递了一个很好的值,因此没有发现异常。修复调用方法后,一切正常。感谢所有提出想法解决此问题的人。
答案 1 :(得分:-1)
您需要将对象添加到词典
Dictionary<String, Object> wfArgs = new Dictionary<string, object>();
wfArgs.Add("manualResetEvent", manResetEvt);