《WF编程》系列之15 - 顺序工作流与SequenceActivity

3 顺序工作流

Windows Worklow提供两种现成可用的工作流执行风格:顺序和事件驱动(event-driven).顺序工作流的执行过程是一个连续的步骤序列,它在完成一个活动之后会去执行到下一个.比如用顺序工作流模拟将访问记录从网站日志转移到数据库中的操作:第一步,下载日志文件;第二步,将日志批量插入数据库中;第三步,创建新记录的统计结果.尽管顺序工作流也可以使用分支和循环,并且可以接收外部事件,但它的执行过程是可以预料的,并且总是向前执行直到完成为止.

事件驱动工作流则依赖外部事件来驱动执行直到完成.事件驱动工作流也叫做状态机(state machine)工作流.状态机中包含一系列状态(包括初始状态和结束状态)和事件.状态机总是停在一个预设的状态中,直到事件触发之后才会跳转到新的状态上.

3.1 SequenceActivity

活动是Windows Worklow的基本组成块,准确的说,顺序工作流本身就是一个活动-SequentialWorkflowActivity.SequentialWorkflowActivity类继承自SequenceActivity类, SequenceActivity类又继承自CompositeActivity类.这些超类规定了顺序工作流的行为和特征.如下面的类图:

继承自CompositeActivty类的活动可以包含一个或多个子活动.顺序工作流通常包含多个子活动(而且子活动也可以是CompositeActivity).

继承自SequenceActivity的活动总是向前遍历其子活动.SequenceActivity一旦执行完一个子就移动到下一个子活动.当最后一个子活动完成后,序列也就结束了.还有一点需要知道的是SequenceActivity并没有跳转到任意活动的机制.

3.1.1 简单的顺序工作流

作为示例,我们创建一个简单的顺序工作流.这个工作流的功能是增加计数器的计数并输出到屏幕上.首先新建一个Sequential Worklow Console Application项目.项目中包括一个应用程序和一个名为Workflow1的工作流定义.右键单击Workflow1并选择查看代码,在code-beside文件中添加以下代码:

public partial class Workflow1 : SequentialWorkflowActivity

{

int counter = 0;

}

接下来我们从工具箱中拖拽一个CodeActivity到设计器表面.顺序工作流和SequenceActivity的典型执行过程是从最顶端到最底端.拖拽活动时,拖拽点()会显示在指针附近的执行线上.在属性面板中,将这个CodeActivity命名为IncrementCounter.然后再拖拽一个CodeActivity到第一个活动的下方,命名为WriteCounter.最终效果如下图:

下一步,我们通过双击设计器中的活动来给IncrementCounter活动添加一个ExecuteCode事件.设计器会生成该事件的空方法,我们需要做的就是提供详细的内部实现.只需添加一行代码来增加计数:

private void IncrementCounter_ExecuteCode(object sender, EventArgs e)

{

counter++;

}

然后返回设计视图,双击WriteCounter,添加下面的代码:

private void WriteCounter_ExecuteCode(object sender, EventArgs e)

{

Console.WriteLine("The value of counter is {0}.", counter);

}

这时运行这个工作流,我们可以看到一行输出,显示The value of counter is 1.顺序工作流依序执行了两个子活动,在它们执行完后,顺序工作流也就完成了.接下来,让我们添加一些控制流程的活动使工作流更加有趣.

3.1.1.1 序列中的序列

WhileActivity会重复执行它的子活动直到它的条件返回false为止.我们可以拖拽一个WhileActivity来作为工作流的第一个活动.一个空的WhileActivity将在设计器中会显示Drop An Activity Here.这说明我们只能在WhileActivity中添加一个子活动.WhileActivity继承自CompositeActivity类,这意味着它可以包含多个子活动,但是它没有继承SequenceActivity.所以WhileActivity只能执行一个子活动.如果想要在WhileActivity添加多个子活动的话,我们需要把这些活动置于一个SequenceActivity内部,然后把SequenceActivity拖拽到WhileActivity中.工作流最终效果如图所示:

在运行工作流之前,我们需要指定WhileActivity的条件.我们可以把条件写到一个外部规则文件中,也可以直接写到代码中.我们添加下面的方法到工作流代码中:

private void CheckCounter(object sender, ConditionalEventArgs e)

{

e.Result = false;

if (counter < 10)

{

e.Result = true;

}

}

CheckCounter方法是一种特殊的方法,被称作代码条件(Code Condition).在WF中,代码条件通过ConditionalEventArgs参数的Result属性返回true或者false值.在WhileActivity的属性面板中,我们设置Condition为Code Condition,然后在下拉菜单中选择CheckCounter.现在我们可以在控制台中输出10行计数器增加的结果.

当然,并不是所有的工作流都仅仅需要一个counter字段和控制台就足够了.我们经常需要和工作流进行数据往来,传递或取出数据.

http://xiaoshatian.cnblogs.com/

转载于:https://www.cnblogs.com/andylaufzf/archive/2008/08/27/1277520.html

《WF编程》系列之15 - 顺序工作流与SequenceActivity 3 顺序工作流相关推荐

  1. 《WF编程》系列之3 - 漫游工作流:Visual Studio 2005 扩展

    <WF编程>系列之3 - 漫游工作流:Visual Studio 2005 扩展 1.2.2 Visual Studio 2005 扩展 Microsoft提供了一个Visual Stud ...

  2. 《WF编程》系列之23 - 基本活动:IfElseActivity WhileActivity SequenceActivity

    <WF编程>系列之23 - 基本活动:IfElseActivity & WhileActivity & SequenceActivity 4.1.2 IfElseActiv ...

  3. 《WF编程》系列之30 - 基本活动:错误处理

    <WF编程>系列之30 - 基本活动:错误处理 4.3 错误处理 Fault,故障,现在官方已经将其翻译为错误,那么以后的随笔中我也就采用官方的翻译吧. 错误处理也属于流程控制的一部分,这 ...

  4. 【转】异步编程系列(Thread、Task、async/await、ajax等)

    序 经过一番努力,我写的异步编程系列也算有头有尾,当然不是说这个系列已经更新完毕,这个头尾只是表示新旧知识点都有简单涉及到,接下去我还会丰富这一系列并且有机会整个小应用(愿景是弄一个开源组件吧,结合s ...

  5. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...

    本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...

  6. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

  7. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

  8. 敏捷开发“松结对编程”系列之十五:L型代码结构(编程篇之一)

    本文是"松结对编程"系列的第十五篇.(松结对编程栏目目录) 之前的L型代码结构的前三篇提到过,L型代码结构的微观计划和估算过程会与一般的编程方法不同,今天正好要编写一些新代码,边写 ...

  9. shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)

    shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)Shell脚本与MySQL数据库交互(增删改查)# 环境准备:安装mariadb 数据库 [root ...

  10. 【linux草鞋应用编程系列】_4_ 应用程序多线程

    一.应用程序多线程 当一个计算机上具有多个CPU核心的时候,每个CPU核心都可以执行代码,此时如果使用单线程,那么这个线程只能在一个 CPU上运行,那么其他的CPU核心就处于空闲状态,浪费了系统资源: ...

最新文章

  1. Keras卷积+池化层学习
  2. 笔记-信息化与系统集成技术-区块链的技术架构
  3. mysql自增字段_MySQL自增字段的常用语句
  4. SSH-key连接原理
  5. java生成动态验证码_java动态生成验证码
  6. velocity map list 数组操作
  7. 电商项目——分布式基础概念和电商项目微服务架构图,划分图的详解——第二章——上篇
  8. 黑客高手是这样上网的!Vimium、Vimperator 浏览器插件让你全程用键盘快捷高效浏览网页
  9. 小米开源文件管理器MiCodeFileExplorer-源码研究(9)-入口分析
  10. html平铺 拉伸 图片,[CSS]背景图片中平铺与拉伸
  11. as3.0 当fla里面有TLF文本的时候,加载声音会出现错误
  12. 明清时期苏州妇女的服饰追求
  13. kafka | 生产者压缩算法面面观
  14. I'm a pc - I'm a mac :FIT
  15. 汇编语言程序设计第二章--IA32
  16. Introduction of internet P2P technology
  17. python等值面追踪_等值线的追踪算法(1)
  18. 100款复古风格LR调色预设
  19. Vue里如何实现excel转json的功能
  20. 四川大学计算机考研考点,四川大学计算机技术考研

热门文章

  1. 国货如此畸形,改革30年无国际品牌
  2. ScrumChina 2008 上海之行
  3. jquery快速入门(二)
  4. Software Defined Networking(Week 2, part 2)
  5. RedHat Linux设置yum软件源为本地ISO
  6. PostgreSQL数据库的安装与配置
  7. MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限(转)
  8. Junit介绍与实现
  9. Linux系统安全保护措施
  10. 在Linux Redhat 9.0使用YUM