Workflow Windows工作流:持久性和轮询

Workflow Windows工作流:持久性和轮询,workflow,workflow-foundation,Workflow,Workflow Foundation,我目前正在学习WF框架,请耐心等待;大多数情况下,我是在寻找从哪里开始寻找,不一定是一个直接的答案。我似乎不知道如何开始在谷歌搜索我想要的东西 假设我有一个简单的一步工作流程(比这复杂得多,但为了简单起见)。此工作流需要监视数据库中的某个记录,以查看其何时更改。当行发生变化时,我没有能力通过数据库中的触发器“推送”,所以我需要每隔一段时间轮询一次 由于这是一个长期运行的工作流,因此需要将此工作流持久保存到数据库中,以防重新启动等。我正试图找出最好的方法,让它每隔3分钟左右检查一次,并保存到数据库

我目前正在学习WF框架,请耐心等待;大多数情况下,我是在寻找从哪里开始寻找,不一定是一个直接的答案。我似乎不知道如何开始在谷歌搜索我想要的东西

假设我有一个简单的一步工作流程(比这复杂得多,但为了简单起见)。此工作流需要监视数据库中的某个记录,以查看其何时更改。当行发生变化时,我没有能力通过数据库中的触发器“推送”,所以我需要每隔一段时间轮询一次

由于这是一个长期运行的工作流,因此需要将此工作流持久保存到数据库中,以防重新启动等。我正试图找出最好的方法,让它每隔3分钟左右检查一次,并保存到数据库中。框架的持久性功能是否允许这样做?它似乎是基于时间的。由于工作流不会被外部事件重新唤醒,它如何从数据库重新加载并再次检查之前执行的相同步骤?它是否会在重新加载时自动尝试最后一个未完成的活动


带有延迟的“while”活动是否能正常工作,还是只能通过持久性服务来处理?

我不确定“通过持久性服务单独处理”是什么意思?持久性仅指存储空闲工作流

在While循环的序列中可以有一个延迟和一个代码活动。当处于延迟状态时,工作流将处于空闲状态,如有必要,可以将其持久化。但是,根据在持久化工作流时需要多少状态和/或您在任何时候运行多少这样的工作流,可能意味着需要更精简的方法

更精简的方法是将DB监视外部化,并让一些“DB监视”工作流服务在发生所需更改时引发事件。此服务将添加到工作流运行时

为此,您需要一个由具有[ExternalDataExchange]属性的接口定义的服务契约。该接口反过来定义了一个事件,当检测到所需的DB更改时,服务将引发该事件。它还定义了一个方法,工作流可以调用该方法来指定此服务应该寻找的更改。该方法应接受实例GUID,以便在检测到数据库更改时可以找到请求的实例


在工作流中,使用CallExternalMethodActivity调用此服务方法。然后流到HandleExternalEventActivity,该活动侦听事件。此时,工作流将处于空闲状态,并且可以持久化。它将一直保留在那里,直到服务引发事件。

我不确定您所说的“通过持久性服务单独处理”是什么意思?持久性仅指存储空闲工作流

在While循环的序列中可以有一个延迟和一个代码活动。当处于延迟状态时,工作流将处于空闲状态,如有必要,可以将其持久化。但是,根据在持久化工作流时需要多少状态和/或您在任何时候运行多少这样的工作流,可能意味着需要更精简的方法

更精简的方法是将DB监视外部化,并让一些“DB监视”工作流服务在发生所需更改时引发事件。此服务将添加到工作流运行时

为此,您需要一个由具有[ExternalDataExchange]属性的接口定义的服务契约。该接口反过来定义了一个事件,当检测到所需的DB更改时,服务将引发该事件。它还定义了一个方法,工作流可以调用该方法来指定此服务应该寻找的更改。该方法应接受实例GUID,以便在检测到数据库更改时可以找到请求的实例


在工作流中,使用CallExternalMethodActivity调用此服务方法。然后流到HandleExternalEventActivity,该活动侦听事件。此时,工作流将处于空闲状态,并且可以持久化。它将一直保留在那里,直到服务引发事件。

我非常喜欢这种方法。它澄清了我在这个框架中遇到的一些架构问题。谢谢我真的很喜欢这种方法。它澄清了我在这个框架中遇到的一些架构问题。谢谢