8

如何解决这个问题(在 WF4 中):

我在 xaml 中创建了一个工作流并启动了它的几个实例,我有一个持久性存储,并且所有工作流都在其工作流的一半中保留在一个书签上。

现在我停止应用程序

如果我重新启动应用程序,一切都会恢复,很好地完成。

但是,如果我想在运行的实例持续存在后更改工作流定义怎么办?加载正在运行的工作流程(我能够找到)的唯一方法是以下方式:

        WorkflowApplication wfapp = new WorkflowApplication(new WorkflowDefinition());
        wfapp.InstanceStore = new SqlWorkflowInstanceStore(connStr);

        wfapp.Load(wfGuid);

所以你需要工作流定义,如果它在持久化过程中发生了变化,事情就会大错特错。

解决这个问题的最佳方法是什么?

4

5 回答 5

3

这个场景有点问题。无法将旧的工作流定义迁移到新格式。我已经完成了一些有限的测试和一些添加/删除尚未执行的活动的场景。但后来我也遇到了严重错误的情况,包括重新执行已经完成的活动。

据我所知,除了跟踪用于创建工作流的 XAML/程序集的版本并检查何时要重新启动工作流以确定要使用的工作流版本之外,没有其他解决问题的好方法。

于 2010-01-15T12:25:29.497 回答
2

同一工作流程的许多版本必须共存。我的意思是,旧实例必须以旧工作流版本结束,而新实例必须以新工作流版本开始。就我而言,我们有工作流服务。在配置中,路由器描述了实例尝试执行的顺序。如果一个实例无法使用一个版本开始工作,则尝试下一个版本,依此类推。

此外,如果您的更改不涉及对工作流变量、暴露的合同等的更改……新旧工作流实例版本可以在相同的工作流版本上运行。你会知道的,测试它。

于 2011-04-04T07:53:07.610 回答
2

可能有帮助

http://msdn.microsoft.com/en-us/magazine/dd727506.aspx

于 2010-04-07T09:51:37.930 回答
1

这不是 Windows Workflow 的问题,因为它是 SQL 持久性服务。您可以创建自己的持久性服务来处理这种情况,或者通过支持将旧工作流转换为新工作流或更抽象的东西,比如序列化为 XML/JSON 的持久性服务,这可能更容易支持反序列化一个版本作为另一个版本。

于 2010-01-26T22:06:23.043 回答
1

可以在更改 WF4 中的定义后加载持久化的 wf 实例 - 您必须解析和更改 wf 引擎存储的 xml 文件。您应该创建两个相同的工作流程:使用旧版本和新版本,并比较它们以消除差异。必须对定义 xml 和用于存储工作流状态的复杂数据 xml 执行此操作。用 LinqToXML 解析它会节省很多时间,而且你必须确保你已经检查了所有的差异——如果还剩下一个差异,wf 将无法加载。有一个元素“ResumeData”,你可以在 wf 状态 xml 中找到它,它太重而无法解析,但好消息是你可以简单地删除它。

于 2014-01-09T11:35:42.080 回答