如何取消和回滚部分工作流程

时间:2012-09-27 10:53:15

标签: c# workflow workflow-foundation-4

我有一个很长的工作流程,可以在视频处理设备之间移动视频文件,然后将文件状态报告给用于驱动UI的数据库

用户有时按下UI上的按钮以“接受”文件到视频存储服务器。这涉及将文件从一个服务器复制到另一个服务器。]

他们询问是否可以取消此活动。

我查看了wf4文档,但我看不到回滚部分工作流的方法。

这是可能的,我应该使用什么技术。

3 个答案:

答案 0 :(得分:2)

这是恢复工作的两个基本的内部活动。

  1. 用于ACID交易的TransactionScope
  2. 长期工作的可补偿活动。
  3. 使用Compensable活动,您可以向补偿处理程序添加活动以撤消之前完成的工作。 Compensate活动可用于触发补偿。如果没有补偿,您将在工作流程结束时或在使用Conform活动时获得确认处理程序。

    有关详细信息,请参阅Matt Milner的A Developer's Introduction to Windows Workflow Foundation (WF) in .NET 4

答案 1 :(得分:1)

不确定我是否完全了解您的情况,但我认为您需要在异步线程上运行转移过程,不时检查"取消"变量以执行回滚。可以在UI的主线程上修改此变量。

当然,这将允许您在转移之间取消,而不是在单次转移中取消。

答案 2 :(得分:1)

好的,我们首先要说,“回滚”已经上传的内容的处理必须手工完成,所以无论你在哪里储存这些块,你都需要在取消时用手清理

现在,关于工作流程本身,在我看来,您可以像这样设置FlowChart

FlowChart

Process Loop Part 1

Process Loop Part 2

好的,让我们分解这个工作流程。整个服务应该与某个客户端密钥相关联,这样您就可以每个客户端使用Start启动一次服务,以降低启动成本。

接下来,当所述客户想要开始转移时,您将调用BeginTransfer,它将进入转移循环。设置传输循环,以便您可以在必要时通过调用CancelTransfer取消组块。

在此模型中,同样的分支也用于完成传输,因为它已经离开循环,因此当您完成传输块时,只需调用CancelTransfer(如果您不喜欢只是设置一个看起来完全相同的不同分支。)

最后,当您处于流程循环中时,您可以SoftExit整个工作流程并将其关闭,以便在有必要的维护时可以轻轻地将其删除客户端已完成其连接,需要调用SoftExit来处理它。