如何从内部取消或终止工作流程

时间:2011-11-16 12:02:49

标签: c# workflow workflow-foundation-4

我有一个工作流程,可以在ftp站点之间移动文件。 可能是用户在工作流即将复制时从ftp站点删除文件的情况。我可以检测到文件已经消失,所以我想取消关于进行文件传输的工作流程。

我使用工厂开始我的工作流程。工厂创建一个辅助类(wfManager),辅助类使用WorkflowApplication启动实际工作流。

工作流本身根据文件是否丢失来确定是否应该关闭。工作流程引用了启动它的wfManager,因此从wfManager调用workflowApplication.close

我原以为如果我使用wfManager中的WorkflowApplication.close工作流将会关闭。

然而,结束时间超时。

什么会导致关闭超时,是否有通用代码关闭或终止工作流的通用方法?

3 个答案:

答案 0 :(得分:4)

您基本上有3个选项来结束工作流程:

  • Cancel
    正如您所看到的那样等待一段时间(因此工作流可以完成当前正在执行的任何操作),然后关闭工作流,然后调用OnCompleted处理程序
  • Terminate
    这需要终止(作为参数)的原因,等待一点时间(因此工作流可以完成当前正在做的任何事情),然后关闭工作流,然后调用OnCompleted处理程序
  • Abort
    这只会杀死工作流程,而不会调用OnCompleted handler。

MSDN参考:

答案 1 :(得分:2)

此外,您可以使用TerminateWorkflow活动从工作流内部终止工作流程。

还要记住,WF4中的所有内容都是异步的,如果工作流在活动中阻塞,则Cancel()调用将超时,因为调度程序当时只执行一个操作。

答案 2 :(得分:2)

如果工作流决定要取消自己,则有两个选项

  1. 抛出未处理的异常 - 导致工作流程中止(符合恢复条件)
  2. 使用终止活动 - 结果终止工作流程(工作流程完成)
  3. 在您的方案中,您应该使用终止活动。

    尝试回调试图取消回调线程上的工作流的其他对象是一种灾难的处方(正如您所发现的)。同样,您无法从任何委托处理程序或扩展程序中取消工作流程。