工作流编程循序渐进(4:InvokeWorkflowActivity活动)

一、简介

使用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活动的转换关系,得到如图所示的情形。

时间: 2024-10-29 14:06:14

工作流编程循序渐进(4:InvokeWorkflowActivity活动)的相关文章

工作流编程循序渐进(3:While活动)

一.引言本文中,我们来学习另一个简单活动--While活动.While活动将会持续循环的执行,直至指定判断为假. 下面,我们来构建一个简单的示例.本示例的目的是,想主要使用While活动实现显示一个九九乘法表. 二.创建控制台顺序工作流示例程序框架 请遵循如下步骤创建一个控制台顺序工作流示例程序: 1.启动VS2008,单击菜单"文件"|"新建"|"项目",创建一个名字为WhileActivity的控制台顺序工作流示例程序. 2.之后,系统自动打

工作流编程循序渐进(2:IfElseActivity活动)

一.引言本文中,我们来学习另一个简单活动--IfElseActivity.关于此活动,首先需要说明一下: 借助于IfElseActivity活动,你可以创建工作流中的分支结构,每一个分支对应于一个IfElseBranehActivity分支. IfElseActivitv活动可以有条件地选择执行多个IfElseBranchActivity分支中的一个.也就是说,对每个IfElseBranchActivity活动的执行,都必须被一个条件所激发. 对于IfElseBranchActivity活动的执

工作流编程循序渐进(1:代码活动与时间延迟活动)

创建控制台顺序工作流示例程序框架 请遵循如下步骤创建一个控制台顺序工作流示例程序: 1.启动VS2008,单击菜单"文件"|"新建"|"项目",创建一个名字为CodeAndDelay的控制台顺序工作流示例程序,见下图. 2.之后,系统自动打开工作流设计器界面,如图所示. 3.从工具箱中依次拖动Code,Delay,Code三个活动到图中右侧的汉字提示处,得到如图所示的情形. 此时,图中的三个活动相关参数都没有经过设置,下面将设置有关参数.

工作流编程循序渐进(5:状态机工作流)

一.状态机工作流简介 状态机工作流由一组状态组成.一个状态被指示为初始状态.每个状态都可以接收一组特定事件.视事件而定,可以转换到另一个状态.状态机工作流可以有最终状态.当转换到最终状态时,工作流将完成. [一]状态机设计器视图 状态机设计器是一种自由形式的设计器,这意味着可以在设计图面上自由移动活动. 状态机设计器有两个视图: (1)"状态"视图 (2)"事件驱动"视图 状态视图显示状态活动和可包含在状态活动内的事件驱动的活动.在此视图中,从一个状态到另一个状态的

Symbian编程总结-基础篇-活动对象正解(4)-异步函数的同步调用

在上一节里我们深入了解了活动对象.活动调度器及异步函数服务器的工作原理及运行机制,想必大家对活动对象的机制及体系结构的运用已经了如指掌.但是大家有没有觉得异步函数使用起来比较麻烦呢?难道非要使用活动对象,非得以"异步"的方式调用异步函数吗?这一节将为大家解决这个问题:异步函数的同步使用. 一.使用CActiveSchedulerWait类 在以前的文章"Symbian编程总结-界面篇-打开jpeg/gif/png图像"里我们已经看到了CActiveScheduler

Symbian编程总结-基础篇-活动对象正解(3)-活动对象的工作原理

在上一节里我们已经知道如何创建和使用活动对象,大家对活动对象的创建.使用都有了一定的了解.在这一节里我将深入活动对象机制,分为"活动对象的工作流程"."信号迷失错误"两个部分,为大家剖析活动对象的工作原理. 一.活动对象工作流程 首先我们用时序图来说明一下应用程序.活动对象.活动调度器及异步函数服务器之间创建及调用的流程: 下面我们针对每一个步骤结合代码(点击此处下载代码)进行说明: 1.创建并安装活动调度器: CActiveScheduler* scheduler

Symbian编程总结-基础篇-活动对象正解(2)-使用活动对象

在上一节里我们已经大致了解了活动对象的基本概念,要使用活动对象机制,需要用到活动对象.活动调度器.异步函数.我们想使用异步函数,要按照应用程序->活动对象->活动调度器->异步函数的流程来使用.接下来我们开始进入实战,使用活动对象. 一.创建活动调度器 我们知道,活动调度器是应用程序和异步函数之间的桥梁,应用程序使用活动对象通过活动调度器去截获异步函数的返回"完成"消息,并以事件的方式通知应用程序. 使用Carbide C++ 1.3,通过模板向导生成的控制台程序自动

Symbian编程总结-基础篇-活动对象正解(1)-理解活动对象

Symbian OS中的活动对象的使用无疑是最基础的.最频繁的.最重要的.什么是活动对象呢? 大家学习一个新的事物时,总是会将这个新的事物与自己认知的事物相比较,从而达到快速学习的目的.我开始学习Symbian的时候,我查看很多Symbian书籍.网上很多Symbian教程都将活动对象与多线程联系到一起,我也总是会把活动对象想象成一个线程.然而,经过了更深入的接触,我发现并不像我想象的那样. 现在,我在此向你保证:活动对象和多线程没有任何关系!不要拿平时做多线程的思想去理解活动对象! 活动对象可

使用Spring来创建一个简单的工作流引擎_Java编程

文章来源:matrix 作者:Steve Dodge 摘要 spring是支持控制反转编程机制的一个相对新的框架.本文把spring作为简单工作流引擎,将它用在了更加通用的地方.在对工作流简单介绍之后,将要介绍在基本工作流场景中基于Spring的工作流API的使用. 许多J2EE应用程序要求在一个和主机分离的上下文中执行处理过程.在许多情况下,这些后台的进程执行多个任务,一些任务依赖于以前任务的状态.由于这些处理任务之间存在相互依赖的关系,使用一套基于过程的方法调用常常不能满足要求.开发人员能够