如何强行杀死WorkflowInstance?

时间:2011-07-05 16:55:37

标签: c# workflow-foundation workflow-foundation-4

我有一个不寻常的情况,我需要能够在给定的超时阈值之后彻底屠杀“挂起”,自我托管的WorkflowInstance。我尝试了Abort()Terminate()Cancel()方法,但这些方法太“好”了。他们似乎都需要WorkflowInstance的响应才能获得荣誉。

在我的场景中,工作流进入无限循环,因此没有响应。由于工作流完全没有响应,因此调用上述常规方法只会挂起。我很惊讶地发现WorkflowRuntime似乎没有处理这种情况的机制,或者Abort()Terminate()仅仅是建议而不是暴力指令。

我搜索google / msdn / stackoverflow / etc试图找出当Terminate()根本无法完成工作并干涸时该怎么做。我考虑创建自己的基本活动并给它一个超时值,这样我的“root”活动可以在其子活动之一挂起时自行终止。这种做法好像我会用大锤敲打苍蝇......

我忽略了一项技术吗?

2 个答案:

答案 0 :(得分:1)

唯一真正的解决方案是将此视为错误,修复出错的问题,并考虑此事已结束。

强制中止锁定在无限循环中的任何代码的唯一方法是在线程上调用Abort()。当然,这被认为是糟糕的juju,只有在通话结束后才能确保应用程序的状态。

因此,您必须提供WorkflowApplication您编写的SynchronizationContext实施,该实施可以在工作流Post()的线程上调用Abort()

答案 1 :(得分:0)

我不确定这是否可行,但您是否尝试过WorkflowInstance.TryUnload()函数?我记得这可以解决工作流程中的一些事件(自从我这样做以来已经有一段时间了),所以你可能在你的工作流程中有一个事件处理程序来捕获它并自行执行kill开关。