ManualResetEvent.WaitOne()抛出NullReferenceException:对象引用未设置为对象的实例

时间:2015-04-27 14:51:32

标签: c# manualresetevent

在处理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中调试此代码时,一切正常,但只有当应用程序处于发布模式时,才会看到此异常。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

您需要将对象添加到词典

Dictionary<String, Object> wfArgs = new Dictionary<string, object>();
wfArgs.Add("manualResetEvent", manResetEvt);