我有一个WCF Windows工作流(4.5)工作流服务托管在IIS和使用AppFabric 1.1。工作流程实例长时间运行(长达大约一周),但大部分时间都用于延迟活动。AppFabric托管工作流并不总是在延迟/卸载后重新加载
这似乎一开始工作正常,但是当同时运行多个工作流实例(2 +个实例导致这种情况)时,其中一些只是在延迟步骤中从内存卸载后才会唤醒。当我查看日志,我发现所有的错误是这样的:
System.OperationCanceledException: The execution of InstancePersistenceCommands has been canceled because the InstanceHandle was freed.
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.WaitAndHandleStoreEventsCallback(IAsyncResult result)
不幸的是,我没有找到该错误消息的任何有用的信息。
AppFabric Persisted Instances Table中的SuspensionExceptionName和SuspensionReason字段显示System.NullReferenceException:未将对象引用设置为对象的实例。但是这不会发生在我的工作流程内,只在外面。
附加信息:
- 我跑活动作为消防&忘记(接收活动,没有发送)
- 我的工作流程调用到其他WCF服务来获取数据。
- 我在Server 2012 R2上运行IIS 8(不是天蓝色)
- Workflow Persistence正在工作。我可以重置IIS,重启......当我运行2个实例时,它有问题。
- 我绝对没有遇到任何类型的限制。虽然工作流程处理几MB的数据,但这个问题发生在2+实例。
任何想法可能发生在这里?
编辑: 我意识到我发现了更多关于问题如何运作的信息,并且从未将它添加到问题中。当延迟问题发生时,它的运行很像一个由2个线程写入的静态变量。
这里有一个可视化:
WF1 Start ---->Do Stuff--->Sleep------------*1----->Cancelled Exception at some point
------WF 2 Start---->Do Stuff------->Sleep->Wake up---------*2------>More Stuff---->End Successfully
*1 - When WF Instance 1 Should Wake up (Same time as WF 2 wakes)
*2 - When WF Instance 2 Should have woken up (Seems to be ignored)
之前有人问......我在我的代码去掉每一个静态变量,方法,类的。没有什么是静止的了。
感谢您的回答!这听起来像一个与我有什么不同的问题(我的问题只会在多个实例出现时才会发生,并且更像静态变量被线程覆盖,一个在错误的时间唤醒,另一个不会唤醒...)但是我会记住长时间的延迟。 – ChrisG 2015-04-02 17:55:58