3

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

我在这里做错了什么?

4

2 回答 2

0

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

于 2015-04-27T16:03:59.210 回答
-1

您需要将对象添加到字典

Dictionary<String, Object> wfArgs = new Dictionary<string, object>();
wfArgs.Add("manualResetEvent", manResetEvt);
于 2015-04-27T15:12:14.123 回答