一、简介
使用InvokeWorkflowActivity 活动可以从一个工作流中异步方式启动另一个工作流。 在已启动的工作流开始执行且工作流分支中的下一个活动执行之前,InvokeWorkflowActivity 活动即告完成。
注意:
* WF不支持递归工作流。如果工作流A能够启动工作流B,则工作流B既不能直接启动工作流A,也不能启动任何直接或间接调用工作流A的工作流。
* InvokeWorkflowActivity活动要求工作流运行时使用当前附加到该运行时的计划程序服务创建新工作流。
* 所调用的工作流将只能够接收输入参数。不支持在工作流完成之后获取输出参数,因为该活动以异步方式调用工作流。
* 工作流之间的标准通信规则适用于与InvokeWorkflowActivny活动所创建的新工作流实例进行通信。
使用InvokeWorkflowActivity活动的步骤如下:
* 拖动一个InvokeWorkflowActivity到工作流中希望的位置处。
* 设置TargetWorkflow属性为希望执行的工作流的类型(Type)。
* 为TargetWorkflow设置所需要的值。
当设置TargetWorkflow属性时,该活动提供了对话框允许从所有引用到的活动类型列表中导航到正确的类型,但是只有派生自Activity的类会被显示在列表中。为了引用一个新的工作流类型,必须首先添加到包含工作流的项目或程序集的引用。具体对话框请参考本文后面的图示。
一旦定义了TargetWorkflow属性,工作流的参数集合属性将使用定义在TargetWorkflow中的其他任何属性所更新。允许开发人员在属性窗口中为任何所需的属性设置值,可以设置静态值或者是绑定属性到当前工作流的其他属性或者是其他活动的其他属性。
InvokeWorkflowActivity提供了一个Invoking事件允许开发人员使用代码处理。该事件在创建一个新的工作流之前触发,这使开发人员在开始一个新的工作流之前能够有机会完成一些设置任务。
关于InvokeWorkflowActiv时的一个重要方面工作流将以异步的方式执行,因此不会等待新工作流的执行完成。因为执行过程是异步的,所以无法获取另一个工作流的输出参数。通常需要和宿主建立额外的通信机制来获取其输出。
二、创建控制台顺序工作流示例程序框架
说明:本文创建的InvokeWorkflowActivityDemo示例演示了如何在一个状态机工作流内部调用另外的一个工作 SubWorkflow,并且定义了本地服务接口实现,使用HandleExternalEvent活动调用外部事件以等待被调用的工作流实例执行完成。该活动需要等待一个事件的触发才能够继续工作流的运行,而在Program.cs中,设置了只有当指定非宿主工作流执行完毕后,才触发事件。因此这实现了一种等待被调用工作流执行完成才继续执行的效果。
重要提示:
本实例的学习基于WWF中的许多新概念(不包括在以前的教程中),请结合后面的参考资料全面理解。个别难点,请不必过于担心,我会在后面的系列文章中作细致的剖析。
请遵循如下步骤创建一个控制台状态机工作流示例程序:
1.启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为InvokeWorkflowActivityDemo的控制台状态机工作流示例程序。
2.之后,系统自动打开工作流设计器界面。
3.从工具箱中拖动四个State活动到工作流设计器中。然后,再依次把两个StateInitialization活动分别拖动到前两个State活动中,再拖动一个EventDrivenActivity活动到第三个State活动中。最后,再使用拖动手柄的方法创建四个State活动的转换关系,得到如图所示的情形。