在处理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()通知调用者时,我看到调用者NOT WWF出现NPE异常。


  System.NullReferenceException:对象引用未设置为对象的实例。


我真的不知道这个异常是从哪里产生的。当我在VS IDE中调试此代码时,所有代码都可以正常运行,但只有在应用程序处于“发布”模式下时,才会看到此异常。

我在这里做错了什么?

最佳答案

我找到了问题的答案。基于James Thorpe的建议,我从异常中打印了堆栈跟踪,结果发现,调用该方法时应用程序正在发送NULL数据点,而WaitOne()不会导致NPE。当我从VS IDE调试器运行单元测试时,我传递了一个很好的值,因此没有发现异常。修复了调用方方法后,一切运行良好。感谢所有提出解决此问题的想法的人。

10-06 12:18