关于 c#:Windows Workflow Foundation NullReferenceException

Windows Workflow Foundation NullReferenceException

我在使用 WWF 和外部引发的事件时遇到了 NullReference 问题。 WWF 状态机与在状态机中引发事件的服务实例一起工作,以提供数据——当然——改变状态。虽然使用事件的"正常"操作可以正常工作,但我遇到了一个奇怪的问题。

为了处理超时场景,我让状态初始化程序使用外部超时机制在提到的服务中注册回调。在给定时间之后,回调函数运行并应在状态机中引发超时事件。事件定义如下:

1
event EventHandler<ExternalDataEventArgs> DeviceSysmapBrdcstTimeoutEvent;

并且如前所述,如果没有从超时机制中调用,则可以正常工作。 ExternalDataEventArgs 是使用有效的 Guid 创建的。在事件中访问委托时引发异常:

1
2
3
4
5
System.Workflow.Activities.EventDeliveryFailedException was unhandled by user code
    Message="Event "DeviceSysmapBrdcstTimeoutEvent" on interface type "..." for instance id "efa3da3d-8546-4fcf-bc56-bbec04df6d69" cannot be delivered."
Source="System.Workflow.Activities"
    StackTrace:
        at System.Workflow.Activities.WorkflowMessageEventHandler.EventHandler(Object sender, ExternalDataEventArgs eventArgs)

有人有想法吗?谢谢。


您应该检查内部异常以获取更多详细信息。检查您的事件服务类是否标记为 [Serializable] 并在事件 args 中将 WaitForIdle 属性设置为 true。

1
2
3
CustomEventDataArgs eventArgs = new CustomEventDataArgs();
//
eventArgs.WaitForIdle = true;

检查这是否能解决问题。

谢谢。


你可能会因为几个原因得到上述异常,你需要检查 Inner exceptions 属性的详细信息

一个可能的原因是我可能希望在超时时从状态 A 转换到状态 B,但在状态更改之前,您需要验证您实际上处于状态 A

为了清楚起见,发布内部异常详细信息


你可以看看这个链接是否有用吗?

http://www.mono-project.com/Gendarme.Rules.Concurrency#ProtectCallToEventDelegatesRule