Recursion Statefinalization/initialization活动仅在叶状态上运行

Recursion Statefinalization/initialization活动仅在叶状态上运行,recursion,workflow,workflow-foundation,finalizer,state-machine,Recursion,Workflow,Workflow Foundation,Finalizer,State Machine,我正在尝试让我的Windows状态机工作流与最终用户通信。我试图在StateActivity中实现的一般模式是: StateInitializationActivity:向用户发送一条消息,请求回答一个问题(例如,“您是否批准此文档?”),并提供… …EventDrivenActivity:处理用户发送的应答 StateFinalizationActivity:取消消息(例如,文档已撤回,不再需要审批) 如果StateActivity是“叶状态”(即没有子状态),那么这一切都可以正常工作。然而,

我正在尝试让我的Windows状态机工作流与最终用户通信。我试图在StateActivity中实现的一般模式是:

StateInitializationActivity:向用户发送一条消息,请求回答一个问题(例如,“您是否批准此文档?”),并提供…
…EventDrivenActivity:处理用户发送的应答
StateFinalizationActivity:取消消息(例如,文档已撤回,不再需要审批)

如果StateActivity是“叶状态”(即没有子状态),那么这一切都可以正常工作。然而,如果我想使用状态的递归组合,它就不起作用。对于非叶状态,StateInitialization和StateFinalization不会运行(我通过使用Reflector检查StateActivity源代码确认了这种行为)。EventDrivenActivity仍在侦听,但最终用户不知道发生了什么

对于StateInitialization,我认为解决这个问题的一种方法是用EventDrivenActivity和零延迟计时器替换它。我被困在状态最终确定的问题上


那么-有没有人知道如何让状态终结活动始终运行,即使对于非叶状态也是如此?

不幸的是,“嵌套状态”的结构是包含“子”的“父”结构之一,设计器UI重新实施了这一概念。因此,以你的思维方式思考是非常自然和直觉的。这是不幸的,因为这是错误的

真正的关系是“一般的”->“具体的”。它实际上是一种等级结构。考虑一个更亲近的关系:-< /P>
public class MySuperClass
{
    public MySuperClass(object parameter) { }
    protected void DoSomething() { }
}

public class MySubClass : MySuperClass
{
    protected void DoSomethingElse() { }
}
这里的
MySubClass
继承了
DoSomething
来自
超类的
。但是,由于
超类
没有默认构造函数,上述方法被破坏。另外,
超类
的参数化构造函数不被
子类
继承。实际上,从逻辑上讲,子类从不继承超类的构造函数(或析构函数)。(是的,默认构造函数有一些神奇的连接,但这是糖分多于物质)

类似地,与另一个
StateActivity
包含的stateAcivity之间的关系实际上是包含的活动是容器的专业化。每个包含的活动都继承容器的事件驱动活动集。但是,每个包含的状态活动都是工作流中的第一类离散状态,与任何其他状态相同

包含实际活动的活动变成了一个抽象,它不能转换到另一个状态,更重要的是,不存在转换到另一个“内部”状态的真实概念。从广义上讲,也没有离开这种外部状态的概念。因此,不存在包含StateActivity的初始化或终结

设计器的一个怪癖允许您添加StateInitialization和StateFinalization,然后将StateActivities添加到状态。如果您以另一种方式尝试,设计器将不允许您,因为它知道初始化和终结将永远不会运行


我意识到这实际上并没有回答你的问题,我不愿意在这种情况下说“这是不可能的”,但如果可以的话,那就有点麻烦了。

不幸的是,“嵌套状态”的结构是一个包含“子项”的“父项”结构,设计师UI重新实施了这一概念。因此,以你的思维方式思考是非常自然和直觉的。这是不幸的,因为这是错误的

真正的关系是“一般的”->“具体的”。它实际上是一种等级结构。考虑一个更亲近的关系:-< /P>
public class MySuperClass
{
    public MySuperClass(object parameter) { }
    protected void DoSomething() { }
}

public class MySubClass : MySuperClass
{
    protected void DoSomethingElse() { }
}
这里的
MySubClass
继承了
DoSomething
来自
超类的
。但是,由于
超类
没有默认构造函数,上述方法被破坏。另外,
超类
的参数化构造函数不被
子类
继承。实际上,从逻辑上讲,子类从不继承超类的构造函数(或析构函数)。(是的,默认构造函数有一些神奇的连接,但这是糖分多于物质)

类似地,与另一个
StateActivity
包含的stateAcivity之间的关系实际上是包含的活动是容器的专业化。每个包含的活动都继承容器的事件驱动活动集。但是,每个包含的状态活动都是工作流中的第一类离散状态,与任何其他状态相同

包含实际活动的活动变成了一个抽象,它不能转换到另一个状态,更重要的是,不存在转换到另一个“内部”状态的真实概念。从广义上讲,也没有离开这种外部状态的概念。因此,不存在包含StateActivity的初始化或终结

设计器的一个怪癖允许您添加StateInitialization和StateFinalization,然后将StateActivities添加到状态。如果您以另一种方式尝试,设计器将不允许您,因为它知道初始化和终结将永远不会运行


我意识到这实际上并没有回答你的问题,我不愿意在这种情况下说“这是不可能的”,但如果可以的话,那就有点麻烦了。

好的,下面是我最后决定做的。我创建了一个自定义跟踪服务,它查找与进入或离开与最终用户通信所涉及的状态相对应的活动事件。该服务在输入状态时将用户的决策输入数据库,在离开状态时将其删除。用户可以查询数据库,查看工作流正在等待哪些决策。工作流使用EventDrivenActivity中的ReceiveActivity侦听用户响应。这也行