【问题标题】:Abort child workflow by a trigger通过触发器中止子工作流
【发布时间】:2012-03-05 08:25:31
【问题描述】:

我正在通过父工作流执行动态加载的子工作流。当子工作流正在执行时,我想中止当前的子工作流并根据来自父工作流的用户输入从动态加载的文件 (.xaml) 启动新的工作流。
我的父工作流是一个作为服务公开的状态机,它具有在状态的进入方法中执行另一个加载的子工作流的状态(使用 Microsoft.Activities.Extensions )。我希望子工作流根据扳机。子工作流可以是状态机或顺序的。

【问题讨论】:

    标签: workflow-foundation workflow-foundation-4 parent-child state-machine


    【解决方案1】:

    有两种方法可以中止工作流。

    1. 宿主 WorkflowApplication
    2. 工作流本身可以使用 Terminate 活动

    在您的情况下,Microsoft.Activities.Extensions 使用 WorkflowInvoker 来调用工作流,并且您不能中止子工作流,因此您唯一的选择是让子工作流检查某种“信号”以终止如果它是循环。

    这个“信号”可以是文件的存在、数据库中的记录等。

    【讨论】:

    • 我想要做的是通过外部触发器(对父工作流的 WCF 调用)停止子工作流。假设我的子工作流也是一个状态机,我想在父工作流中将状态更改为最终状态。这可能吗?
    • 是的,这是可能的——但您需要从每个想要退出的状态进行两次转换。因此,假设您有几个状态,然后是最终状态 - 在您需要能够中止的每个状态中,您都需要至少有两个触发器。一个将在触发器中有一个接收(这是您调用以停止工作流的入口点),其他将用于处理。但是,其他人必须实现一些会发出书签的东西,以便可以访问接收!所以我想在这里使用@RonJacobs 方法。
    • 因为 Microsoft.Activities.Extensions 使用 WorkflowInvoker 来调用您不能使用接收活动或书签的子工作流。子工作流必须是可以由 WorkflowInvoker 运行的东西。如果您需要更复杂的东西,则必须基于 WorkflowApplication 创建更高级的 InvokeWorkflow 版本——这将变得很棘手。坚持父工作流和子工作流之间的消息传递可能会更好。
    • 好的。假设我的子工作流程是一个状态机,并且信号在数据库记录中。在这种情况下,正如@mperrenoud03 所说,我必须在所有状态下触发最终状态。另一件事是即使更改了数据库条目,孩子中的触发器如何知道这一点?那我需要定期检查数据库吗?或者我可以将我的子工作流作为服务公开给外部(而不是通过父)调用吗?
    • 抱歉,我错过了您的孩子是 XAML 文件而不是 XAMLX 的事实。请记住,无论如何都要关注@RonJacobs,考虑到他是谁。罗恩 - 很抱歉,我看起来好像在违背你的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2010-12-26
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多