1

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

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

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

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

这可能吗?我应该使用什么技术。

4

3 回答 3

2

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

  1. ACID 事务的 TransactionScope
  2. 长期工作的有偿活动。

使用 Compensable 活动,您可以将活动添加到补偿处理程序以撤消之前完成的工作。补偿活动可用于触发补偿。如果没有补偿,您将在工作流结束时自动获得确认处理程序,或者在您使用 Conform 活动时获得确认处理程序。

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

于 2012-09-30T09:45:11.880 回答
1

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

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

于 2012-09-27T10:56:54.717 回答
1

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

现在,就工作流程本身而言,我认为您可以这样设置FlowChart

流程图

过程循环第 1 部分

处理循环第 2 部分

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

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

在这个模型中,同一个分支也用于完成传输,因为它脱离了循环,所以当你完成传输块时,只需调用CancelTransfer(如果你不喜欢这样,只需设置一个看起来完全相同的不同分支)。

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

于 2012-09-27T11:47:03.503 回答